大分页查询

  大分页查询说的是分页中比较靠后的查询,小白可能觉得在mysql 中查询第 1 页和第 100000 页没有什么不同,其实不然。分页越靠后,mysql 需要花费大量的时间扫描那些需要跳过的数据,简单查询的效率只会更低。

  现在有一张表A ,共 65 列,数据行有 350w+ ,我们按照时间排序后分页,时间列上建有索引,常见简单的小分页查询如下

SELECT * FROM A ORDER BY CreateTime  LIMIT 0,10;

  这种经典的小分页查询效率极高,不到 0.01s 即可完成。那如果我们需要查询的是从第 10w 行开始的 10 条数据,当然,还可以写成下面这样

SELECT * FROM A ORDER BY CreateTime  LIMIT 100000,10;

  间隔测试几次,发现分别用时 6.691s, 8.606s8.726s ,这肯定是不可接受的!

  如何优化呢?这里我们可以先覆盖索引再关联,也就是延迟关联的方式,如下所示

SELECT
	*
FROM
	A sa
INNER JOIN (
	SELECT id FROM A ORDER BY CreateTime LIMIT 100000, 10
) a ON sa.id= a.id

  右表直接通过覆盖索引的方式获取目标行的主键列,然后再关联获取目标行的所有列。间隔测试发现用时都不到 0.05s

  

  实际中,可能并不会存在这样大分页查询第 1w 页数据的变态业务,即使有,也可以通过预先计算或者缓存。

  另外,覆盖索引是mysql 查询的神器,当用则用

posted @ 2022-05-04 09:12  远走不高飞  阅读(77)  评论(0)    收藏  举报