SELECT Aa.*, B.col, B.col, C.col, C.col
FROM (
SELECT A.col, A.col, ... -- 12 個列
FROM A
WHERE A.class1id = 1000000
ORDER BY A.oktime DESC
LIMIT 286660, 20
) Aa
LEFT JOIN B ON Aa.class2id = B.id
LEFT JOIN C ON Aa.username = C.username;
-- 1. 創建覆蓋索引
CREATE INDEX idx_1 ON solve_answerinfo (oktime, askid, class1id);
-- 2. 改寫查詢
SELECT Aa.*, B.col, B.col, C.col, C.col
FROM (
SELECT A.col, A.col, ... -- 業務列
FROM A
INNER JOIN (
SELECT askid
FROM solve_answerinfo
USE INDEX (idx_1)
WHERE class1id = 1000000
ORDER BY oktime DESC
LIMIT 389300, 20 -- 深偏移
) aaa USING (askid)
) Aa
LEFT JOIN B ON Aa.class2id = B.id
LEFT JOIN C ON Aa.username = C.username;
| 指標 | 優化前 | 優化後 |
|---|---|---|
| 內層掃描行數 | ~38 萬 (全表掃描排序) | ~20 (索引直接定位) |
| 回表次數 | 38 萬 | 20 |
| 執行時間 | 秒級/分級 | 毫秒級 |
此優化針對 **MyISAM + 深分頁 + 固定排序**。InnoDB 聚簇索引特性不同,同樣原理但索引設計需含主鍵。