问题原因
limit 10000,20意味着扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行;
查询数据量和偏移量成正比。
优化方法
游标分页
也就是前端传递last_id的那种做法。弊端是cursor方式分页只适合用于有顺序的数据且不支持跳页。
利用子查询或join走覆盖索引
-- 传统limit,文件扫描
[SQL]SELECT * FROM tableName ORDER BY id LIMIT 500000,2;
受影响的行: 0
时间: 5.371s
-- 子查询方式,索引扫描
[SQL]
SELECT * FROM tableName
WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 500000 , 1)
LIMIT 2;
受影响的行: 0
时间: 0.274s
-- JOIN分页方式
[SQL]
SELECT *
FROM tableName AS t1
JOIN (SELECT id FROM tableName ORDER BY id desc LIMIT 500000, 1) AS t2
WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT 2;
受影响的行: 0
时间: 0.278s