百萬級數據下 LIMIT 200000,10 掃描 20 萬行丟棄,極慢。核心思路:減少掃描行數,利用索引定位。
SELECT * FROM users WHERE id >= (SELECT id FROM users ORDER BY id LIMIT 100000,1) LIMIT 20;
掃描行數從 100,020 降至 20。實測 10 萬偏移從 0.10s 降至 0.02s。
SELECT * FROM ( SELECT id FROM wl_tagindex WHERE byname='f' ORDER BY id LIMIT 300000,10 ) a LEFT JOIN wl_tagindex b ON a.id=b.id;
需建立 (byname, id) 復合索引。實測 3.21s → 0.11s。
SELECT * FROM users WHERE id > 100073 ORDER BY id LIMIT 20;
無 Offset,極快。適合無限滾動、API 分頁。
SELECT * FROM t WHERE batch_id=123 ORDER BY input_date DESC LIMIT 428775,40;
將大 Offset 轉為小 Offset,需知道總行數、建立排序索引。
阿里等大廠做法:超過閾值不再允許翻頁,引導用戶用搜尋/篩選,提升體驗同時保護資料庫。