隨著偏移量增大,LIMIT 100000, 10 會劇烈變慢,因 MySQL 需掃描並丟棄前 10 萬行。
SELECT * FROM `content`
WHERE id >= (
SELECT id FROM `content` ORDER BY id DESC LIMIT 100000, 1
)
ORDER BY id DESC LIMIT 10;
Using index),極快SELECT * FROM `content` AS t1
JOIN (
SELECT id FROM `content` ORDER BY id DESC LIMIT 100000, 1
) AS t2 ON t1.id = t2.id
LIMIT 10;
EXPLAIN 顯示 DERIVED 表走索引SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS(); -- 取無 LIMIT 總行數
COUNT(*)SQL_CALC_FOUND_ROWS 會掃描全表,大表慎用| 方案 | 適合場景 | 優點 | 缺點 |
|---|---|---|---|
| 子查詢 | 單表、主鍵有序 | 簡單、大幅加速 | 複雜 WHERE 條件難處理 |
| JOIN 延遲關聯 | 通用、多表關聯 | 標準 SQL、效能穩定 | 需主鍵/唯一鍵 |
| FOUND_ROWS | 需總筆數的分頁 | 一查兩得 | 全表掃描、大表慎用 |
WHERE id > :last_id LIMIT 10,無偏移量問題