考虑以下查询:为什么加入子查询非常慢?
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