数据库mysql大数据,count * + order by + limit 慢的问题(分页优化)

今天公司运营反应,后台查数据的时候慢,看了下,log表数据量较大,已经接近千万了,查询了下发现,每次获取分页数据的时候,都需要获取总表数据,总表数据每次查询都需要一定的时间

看了下引擎,使用的是innodb

找不到什么好办法,突然想到这个log表不会删数据,可以根据最终的自增主键id来变相的获得总表行数(我真是太机智了)

于是乎更换了语句

在通过总记录数,和最后一位id数,计算一下偏移,就得到最终的行数了

搞完后发现又出现了新问题

当查询较为靠后的分页内容时,读取速度较慢
这是典型的分页优化问题嘛

于是乎,打算将分页修改为通过主键偏移获取;但是想了下这样不行(根据偏移直接取是通过limit数据,计算得到主键id,然后去取得主键id,但是因为我的查询还需要带条件,这样维护起来更加麻烦了,所以这种方法对应这种场景不可取

于是乎用了另外一种办法

mysql 延迟关联

借用书上源码(侵删)

原语句是这样的

SELECT * FROM `zhuan_score_log` ORDER BY id DESC LIMIT 9647160,20;

执行时间 4.20 sec

修改后

SELECT a.* FROM zhuan_score_log a inner join (select id from `zhuan_score_log` ORDER BY id DESC LIMIT 9647160,20) b using(id);

执行时间 2.66 sec

速度有明显的提升,但也仅此而已了,就这样吧(谁也不会傻傻的把数据拉到最后面去查看,一般都只看前面啦,所以影响还是很小的

虽然第二个问题,改不改没有太大的影响,但是重要的是对待事情的态度

刘杨哥博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • © 2014-2018 liuyangge.com 版权所有 ICP证:津ICP备15004811号-1
  • 联系邮箱:1009856694@qq.com