大分页查询
大分页查询说的是分页中比较靠后的查询,小白可能觉得在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.606s,8.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 查询的神器,当用则用。
浙公网安备 33010602011771号