MySQL LIMIT offset, rows 機制是「先掃描 offset+rows 行,再捨棄前 offset 行」。當 offset 巨大(如第 9 萬頁),效能呈線性下降。本文展示經典優化模式:子查詢先定位 ID,主查詢再範圍掃描。
-- 取第 90001-90100 行(offset=90000)
SELECT * FROM `table` LIMIT 90000, 100;
-- 執行時間:0.23 秒
SELECT id FROM table ORDER BY id LIMIT 90000, 1 僅掃描索引,極快定位起始 IDWHERE id >= 起始ID LIMIT 100,走主鍵範圍掃描SELECT * FROM `table`
WHERE id >= (SELECT id FROM `table` ORDER BY id LIMIT 90000, 1)
LIMIT 100;
-- 執行時間:0.19 秒(提升 ~17%)
EXPLAIN 顯示 Using index)WHERE id > last_id LIMIT 100)-- 首頁
SELECT * FROM `table` ORDER BY id LIMIT 20;
-- 後續頁(前端傳回上頁最大 id)
SELECT * FROM `table` WHERE id > 12345 ORDER BY id LIMIT 20;
游標式分頁無 offset 陷阱,效能恆定,適合無限滾動、API 分頁等高併發場景。