SELECT * FROM `table` WHERE condition ORDER BY id LIMIT (page-1)*pagesize, pagesize;
資料達百萬筆、翻到第幾百頁時,MySQL 必須掃描並捨棄前 N 筆,耗時秒級。
SELECT * FROM `table`
WHERE id >= (
SELECT id FROM `table` WHERE condition ORDER BY id LIMIT 126380, 1
)
ORDER BY id LIMIT 20;
原理:
id。id >= 值 直接命中聚簇索引,回表僅 20 筆。id 為主鍵或唯一索引(聚簇索引鍵)。WHERE condition 欄位有索引支援(或複合索引 (condition_col, id))。-- 首頁
SELECT * FROM `table` WHERE condition ORDER BY id LIMIT 20;
-- 往下翻:記住上一頁最後一筆 id = 126380
SELECT * FROM `table` WHERE condition AND id > 126380 ORDER BY id LIMIT 20;
優點:無 OFFSET、效能固定、適合 API 無限滾動。缺點:無法隨機跳頁。
EXPLAIN 確認 type=range/ref、key=PRIMARY、Extra=Using where。SELECT *,只取必要欄位配合覆蓋索引。SQL_CALC_FOUND_ROWS,改用單獨 COUNT(*)(有索引時極快)。