LIMIT 10000, 10 會掃描前 10010 行再丟棄 10000 行,隨著 Offset 增大,IO 與 CPU 線性增長。測試環境對比:
| 查詢方式 | Offset=10 耗時 | Offset=10000 耗時 |
|---|---|---|
| 直接 LIMIT | 0.0005s | 0.0187s |
| 延遲關聯 | 0.0006s | 0.0061s (快 3 倍) |
利用覆蓋索引快速定位目標主鍵,再回表查試完整欄位:
-- 原始慢查詢
SELECT * FROM yanxue8_visit LIMIT 10000, 10;
-- 優化:先取主鍵,再 JOIN 回表
SELECT v.*
FROM yanxue8_visit v
INNER JOIN (
SELECT vid FROM yanxue8_visit ORDER BY vid LIMIT 10000, 1
) tmp ON v.vid = tmp.vid
LIMIT 10;
UNIQUE NOT NULL 索引)作為定位鍵。若主鍵有空洞,WHERE id >= (SELECT id ...) 可能取不到足夠行數。改用 ROW_NUMBER() 窗口函數:
-- MySQL 8.0+
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY vid) AS rn
FROM yanxue8_visit
)
SELECT * FROM ranked WHERE rn BETWEEN 10001 AND 10010;
WHERE id > last_id ORDER BY id LIMIT 10,無 Offset 問題。深分頁優化首選「延遲關聯」或「游標分頁」,核心是避免掃描大量無用行。應結合業務場景選擇:後台報表用延遲關聯,前端列表用游標分頁,極大資料集交給搜尋引擎。