直接使用 LIMIT offset, size 在大偏移量下性能急劇下降。測試環境:Win2003 + P4 雙核 3GHz + 4GB RAM + MySQL 5.0.19,表 yanxue8_visit。
| 查詢方式 | OFFSET=10 耗時 | OFFSET=10000 耗時 |
|---|---|---|
| 直接 LIMIT | 0.0004~0.0005s | 0.0187s |
| 子查詢優化 | 0.0005~0.0006s | 0.0061s(快 3 倍) |
問題:LIMIT 10000,10 需掃描前 10000 行並丟棄,IO 浪費巨大。
解法:先通過覆蓋索引快速定位偏移位置的主鍵,再回表查詢:
SELECT * FROM yanxue8_visit
WHERE vid >= (
SELECT vid FROM yanxue8_visit ORDER BY vid LIMIT 10000, 1
)
LIMIT 10;
vid),極快定位第 10001 行的主鍵值LIMIT 更優,子查詢有額外開銷vid)有索引,且為遞增/遞減序列LIMIT ... OFFSET ... 配合索引下推進一步優化WHERE id > last_id LIMIT 10