大偏移 LIMIT 935500, 10 導致查詢從 0.05 秒暴增至 2.39 秒。本文提出「子查詢先取 ID」與「INNER JOIN 關聯 ID」兩種改寫方案,實測分別提速 28% 與 30%,並分析適用場景。
t1:994,584 行,主鍵 id,欄位 ftype TINYINT。SELECT * FROM t1 WHERE ftype=1 ORDER BY id DESC LIMIT 935500, 10(原始 2.39 秒)。SELECT * FROM (
SELECT * FROM t1
WHERE id > (SELECT id FROM t1 WHERE ftype=1 ORDER BY id DESC LIMIT 935510, 1)
LIMIT 10
) t ORDER BY id DESC;
ORDER BY DESC 導致 LIMIT 起始值需 +10(935510)。SELECT * FROM t1
INNER JOIN (
SELECT id FROM t1 WHERE ftype=1 ORDER BY id DESC LIMIT 935500, 10
) t2 USING (id);
eq_ref 關聯。| 方案 | 原始 | 子查詢 | INNER JOIN |
|---|---|---|---|
| 耗時 | 2.22 秒 | 2.01 秒 (+10.6%) | 1.70 秒 (+30.2%) |

eq_ref 精準回表取完整列。ORDER BY 欄位與 WHERE 條件欄位建立複合索引(如 INDEX (ftype, id DESC)),進一步消除排序開銷。SQL_NO_CACHE 排除緩存干擾。