LIMIT offset, rows 在分頁場景下,隨著 offset 增大性能急劇下降。本文通過實測對比「直接 LIMIT」與「子查詢定位主鍵再回表」兩種方案在小/大偏移量下的耗時差異,給出明確優化閾值建議。
同一張表 user,主鍵 uid,取 10 條數據。
-- 直接 LIMIT SELECT * FROM user LIMIT 10000, 10; -- ~0.0187s -- 子查詢定位主鍵 SELECT * FROM user WHERE uid >= (SELECT uid FROM user ORDER BY uid LIMIT 10000, 1) LIMIT 10; -- ~0.0061s 結論:大偏移子查詢僅為直接 LIMIT 的 1/3,offset 越大優勢越明顯。
直接 LIMIT offset, n 需掃描前 offset+n 行再丟棄前 offset 行;子查詢先利用覆蓋索引快速定位目標主鍵值,再回表取數據,避免大量無效行掃描。
LIMIT offset, rows。WHERE pk >= (SELECT pk FROM table ORDER BY pk LIMIT offset, 1) LIMIT rows。WHERE pk > last_pk LIMIT rows)。