SELECT i_id, SUM(i_sell) AS i_sell FROM table_data WHERE i_id IN ( SELECT i_id FROM table_data WHERE Gmt_create >= '2011-10-07 00:00:00' ) GROUP BY i_id;
表 70 萬行,子查詢結果含大量重複 i_id。MySQL 將子查詢轉為 EXISTS 相關子查詢,導致外層全表掃描 70 萬行 × 內層關聯,執行數小時未完成。
DEPENDENT SUBQUERY)SELECT t2.i_id, SUM(t2.i_sell) AS sold FROM ( SELECT DISTINCT i_id FROM table_data WHERE gmt_create >= '2011-10-07 00:00:00' ) t1 JOIN table_data t2 ON t1.i_id = t2.i_id GROUP BY t2.i_id;
DISTINCT 大幅縮減驅動行數JOIN 替代 IN,優化器可選擇最佳連接順序| 原始模式 | 優化模式 |
|---|---|
WHERE col IN (SELECT ...) | JOIN (SELECT DISTINCT col FROM ...) d USING (col) |
WHERE col NOT IN (SELECT ...) | LEFT JOIN (SELECT DISTINCT col FROM ...) d USING (col) WHERE d.col IS NULL |
WHERE EXISTS (SELECT 1 FROM ... WHERE outer.col = inner.col) | JOIN (SELECT DISTINCT col FROM ...) d ON outer.col = d.col |
SEMI JOIN 優化,部分場景自動優化IN (值列表) 硬編碼EXPLAIN 驗證 select_type 是否為 DERIVED 而非 DEPENDENT SUBQUERY