| SQL | OFFSET | 耗時 |
|---|---|---|
SELECT * FROM yanxue8_visit LIMIT 10, 10 | 小 | 0.0004~0.0005 秒 |
SELECT * FROM yanxue8_visit LIMIT 10000, 10 | 大 | 0.0187 秒 |
SELECT * FROM yanxue8_visit WHERE vid >= (SELECT vid FROM yanxue8_visit ORDER BY vid LIMIT 10000, 1) LIMIT 10 | 大 | 0.0061 秒(快 3 倍) |
SELECT vid FROM ... ORDER BY vid LIMIT offset, 1 走主鍵/唯一索引,只掃描索引葉子節點定位單一 vid,極快。WHERE vid >= target_vid LIMIT page_size 走主鍵範圍掃描,只讀需求行數。LIMIT offset, size 掃描並丟棄前 offset 行的開銷。-- 取第 N 頁(每頁 10 行),N 從 0 開始
SET @page = 1000; -- 第 1001 頁
SET @page_size = 10;
SELECT * FROM yanxue8_visit
WHERE vid >= (
SELECT vid FROM yanxue8_visit
ORDER BY vid
LIMIT @page * @page_size, 1
)
LIMIT @page_size;
-- 首頁
SELECT * FROM yanxue8_visit ORDER BY vid LIMIT 10;
-- 下一頁(記住上頁最大 vid = 10009)
SELECT * FROM yanxue8_visit WHERE vid > 10009 ORDER BY vid LIMIT 10;
SELECT vid),觸發覆蓋索引,否則子查詢也會回表變慢。vid >= target 取下一頁,vid <= target 取上一頁(需 ORDER BY vid DESC)。LIMIT offset, 1 取到的 ID 可能對應不到預期行數,建議改用 COUNT(*) 計算總頁數,或接受近似分頁。MySQL 大 OFFSET 分頁優化核心:子查詢在索引上定位起始主鍵 + 外層範圍掃描。實測 1 萬行 OFFSET 由 18ms 降至 6ms,提升 3 倍。配合游標分頁模式,可徹底解決深分頁效能痛點。