MySQL 的 LIMIT offset, row_count 語法雖然簡單易用,但在資料量龐大時效能會急劇下降。核心原因在於 MySQL 必須先掃描並捨棄前 offset 筆記錄,再取得所需的 row_count 筆。當 offset 達到數萬甚至數十萬時,查詢時間會從毫秒級飆升至秒級,嚴重影響使用者體驗。
yanxue8_visit(含主鍵 vid)| 查詢寫法 | 執行時間 | 結論 |
|---|---|---|
SELECT * FROM yanxue8_visit LIMIT 10, 10 |
0.0004~0.0005 秒 | 直接 LIMIT 較優 |
SELECT * FROM yanxue8_visit WHERE vid >= (SELECT vid FROM yanxue8_visit ORDER BY vid LIMIT 10, 1) LIMIT 10 |
0.0005~0.0006 秒 | 子查詢額外開銷導致略慢 |
結論:小偏移量時,直接使用 LIMIT 即可,無需複雜改寫。
| 查詢寫法 | 執行時間 | 提升倍數 |
|---|---|---|
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 倍提升 |
結論:大偏移量時,「先取 ID 再回表」策略顯著優於直接 LIMIT。偏移量越大,優勢越明顯。
SELECT vid ... LIMIT offset, 1 僅掃描主鍵索引(極窄),定位目標 ID → 外層 WHERE vid >= 目標ID LIMIT row_count 直接範圍查詢,避免大量捨棄操作WHERE id > last_id ORDER BY id LIMIT page_size。完全避免 OFFSET,效能恆定SELECT t.* FROM table t INNER JOIN (SELECT id FROM table ORDER BY id LIMIT offset, page_size) tmp ON t.id = tmp.id。利用覆蓋索引減少回表掌握 LIMIT 優化核心邏輯,結合業務場景選擇適當策略,能讓分頁查詢在百萬級甚至千萬級資料下依然保持毫秒級回應。