考慮以下查詢:爲什麼加入子查詢非常慢?
SELECT
...
FROM table1
LEFT JOIN table2 ...
LEFT JOIN table3 ...
LEFT JOIN table4 ...
LEFT JOIN table5 ...
LEFT JOIN
(
SELECT id, COUNT(*) as qty FROM other WHERE ... GROUP BY id
) temp ON temp.id = table1.id
WHERE temp.qty = 123
GROUP BY table1.id
此查詢速度很慢,但是當我執行
SELECT id, COUNT(*) as qty FROM other WHERE ... GROUP BY id
單獨
,它的速度極快,它返回只有少數(20-30)行...
我目前的解決方案是與索引臨時表,我寫些數據,然後我用加入:
DROP TABLE IF EXISTS tmp_counts;
CREATE TABLE tmp_counts id INT(11), qty INT(11) ...
INSERT INTO tmp_counts (id,qty) (SELECT id, COUNT(*) as qty FROM other WHERE ... GROUP BY id);
SELECT
...
FROM table1
LEFT JOIN table2 ...
LEFT JOIN table3 ...
LEFT JOIN table4 ...
LEFT JOIN table5 ...
LEFT JOIN tmp_counts ON tmp_counts.id = table1.id
WHERE tmp_counts.qty = 123
GROUP BY table1.id
它工作得非常快,但我覺得這是一個醜陋的解決方案。
MySQL真的很愚蠢我需要自己動手做mysql作業嗎?
你看過執行計劃嗎? – Brandon
@Brandon它正確地使用索引,子查詢被標記爲派生的,臨時表使用其中 – Peter