1 何时需要优化
1.1 单表数据量大,访问最后几页的时候特别慢
比如我们单表的数据有1000w以上,此时当偏移量offset比较大的时候,普通查询会导致查询效率从前几页的几十毫秒,增加到十几秒甚至更高
1.2 非正常访问
其实绝大部分情况下没有多少用户真的翻页到最后几页,大致的情况为前端分页组件有跳转到最后几页的链接,或者是被别人恶意请求数据,比如爬虫爬取数据。
2 问题出现在mysql的limit机制
分页操作通常会使用 limit 加上偏移量的办法实现,同时再加上合适的 order by 子句。但这会出现一个常见问题:当偏移量非常大的时候,它会导致 MySQL 扫描大量不需要的行然后再抛弃掉。
也就是说,在使用limit的时候,当过滤条件不足以过滤掉大部分行的时候,offset过大会导致mysql扫描出大量的数据,再丢弃其中很大一部分,留下想要的部分。
3 解决方案
假设我们的sql如下:
/*偏移量为100,取25*/
SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depname
from emp a left join dep b on a.depno = b.depno order by a.id desc limit 100,25;
/*偏移量为4800000,取25*/
SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depname
from emp a left join dep b on a.depno &#