首页 > 数据库 > MySQL > 正文

在大数据情况下MySQL的一种简单分页优化方法

2024-07-24 13:07:09
字体:
来源:转载
供稿:网友

这篇文章主要介绍了在大数据情况下MySQL的一种简单分页优化方法,分页优化是MySQL优化的常用手段之一,需要的朋友可以参考下

通常应用需要对表中的数据进行翻页,如果数据量很大,往往会带来性能上的问题:

 

 
  1. root@sns 07:16:25>select count(*) from reply_0004 where thread_id = 5616385 and deleted = 0; 
  2. +———-+ 
  3. count(*) | 
  4. +———-+ 
  5. | 1236795 | 
  6. +———-+ 
  7. 1 row in set (0.44 sec) 
  8. root@sns 07:16:30>select id 
  9. from reply_0004 where thread_id = 5616385 and deleted = 0 
  10. order by id asc limit 1236785, 10 ; 
  11. +———–+ 
  12. | id | 
  13. +———–+ 
  14. | 162436798 | 
  15. | 162438180 | 
  16. | 162440102 | 
  17. | 162442044 | 
  18. | 162479222 | 
  19. | 162479598 | 
  20. | 162514705 | 
  21. | 162832588 | 
  22. | 162863394 | 
  23. | 162899685 | 
  24. +———–+ 
  25. 10 rows in set (1.32 sec) 

索引:threa_id+deleted+id(gmt_Create)

10 rows in set (1.32 sec)

这两条sql是为查询最后一页的翻页sql查询用的。由于一次翻页往往只需要查询较小的数据,如10条,但需要向后扫描大量的数据,也就是越往后的翻页查询,扫描的数据量会越多,查询的速度也就越来越慢。

由于查询的数据量大小是固定的,如果查询速度不受翻页的页数影响,或者影响最低,那么这样是最佳的效果了(查询最后最几页的速度和开始几页的速度一致)。

在翻页的时候,往往需要对其中的某个字段做排序(这个字段在索引中),升序排序。那么可不可以利用索引的有序性来解决上面遇到的问题喃,答案是肯定的。比如有10000条数据需要做分页,那么前5000条做asc排序,后5000条desc排序,在limit startnum,pagesize参数中作出相应的调整。

但是这无疑给应用程序带来复杂,这条sql是用于论坛回复帖子的sql,往往用户在看帖子的时候,一般都是查看前几页和最后几页,那么在翻页的时候最后几页的翻页查询采用desc的方式来实现翻页,这样就可以较好的提高性能:

 

 
  1. root@snsgroup 07:16:49>select * from (select id 
  2.  
  3. -> from group_thread_reply_0004 where thread_id = 5616385 and deleted = 0 
  4.  
  5. -> order by id desc limit 0, 10)t order by t.id asc
  6.  
  7. +———–+ 
  8.  
  9. | id | 
  10.  
  11. +———–+ 
  12.  
  13. | 162436798 | 
  14.  
  15. | 162438180 | 
  16.  
  17. | 162440102 | 
  18.  
  19. | 162442044 | 
  20.  
  21. | 162479222 | 
  22.  
  23. | 162479598 | 
  24.  
  25. | 162514705 | 
  26.  
  27. | 162832588 | 
  28.  
  29. | 162863394 | 
  30.  
  31. | 162899685 | 
  32.  
  33. +———–+ 
  34.  
  35. 10 rows in set (0.87 sec) 

可以看到性能提升了50%以上。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表