今天公司运营反应,后台查数据的时候慢,看了下,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
速度有明显的提升,但也仅此而已了,就这样吧(谁也不会傻傻的把数据拉到最后面去查看,一般都只看前面啦,所以影响还是很小的)
虽然第二个问题,改不改没有太大的影响,但是重要的是对待事情的态度
本文为刘杨哥原创文章,转载无需和我联系,但请注明来自刘杨哥博客https://liuyangge.com