MYSQL你们如何解决超多分页性能问题?
济南大飞哥 2019-05-13 11:05:21 阿里巴巴的Java开发手册有这么一个规则:
7. 【推荐】利用延迟关联或者子查询优化超多分页场景。
说明:MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回
N 行,那当 offset 特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过
特定阈值的页数进行 SQL 改写。
正例:先快速定位需要获取的 id 段,然后再关联:
SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id
她的思路是,先拿到所需id,然后回表拿到完整数据。
这里的关键就是子查询,如果拿到id的过程比较“费时”,那么sql的效率依然会比价低。我猜子查询这里应该尽量走覆盖索引。但是这里利用覆盖索引是比较难的。比如我们经常会使用时间段来查询数据,如果只在时间上建索引,那么要拿到id还是得回表,拿到id再回表一次拿到完整数据就得不偿失了。
我试了下通过建时间+id的组合索引,发现子查询的执行计划依然不是use index,而是use where;userindex,然后rows是个很大的值。所以,大家超多分页到底如何搞?