問題原因
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
