我有以下MYSQL查询。
SELECT
COUNT(analyzer_host.server) AS count,
analyzer_host.server AS server
FROM
analyzer_host,
analyzer_url,
analyzer_code
WHERE
analyzer_host.server IS NOT NULL
AND analyzer_host.server != ''
AND analyzer_code.account_id = 33
AND analyzer_code.id = analyzer_url.url_id
AND analyzer_url.id = analyzer_host.url_id
GROUP BY analyzer_host.server;
我对此查询进行了一些分析,并将其卡在“复制到tmp表”中。有办法避免这种情况吗?还有导致查询创建tmp表的所有指针。
最佳答案
第一
SELECT COUNT(host.server) AS count, host.server AS server
FROM host
JOIN url ON url.id = host.url_id
JOIN code ON code.id = url.url_id
WHERE host.server IS NOT NULL
AND host.server != ''
AND code.account_id = 33
GROUP BY host.server;
这样可以消除
analyzer_
混乱,并使用JOIN...ON
语法。其次,似乎JOIN不太正确-在
id
中既有url_id
又有url
吗? url_id
和host
之间的url
是否不同?code
是否具有PRIMARY KEY(account_id)
?那就是优化器要开始的地方。请提供
EXPLAIN SELECT ...
,以便我们查看它是否在进行任何表扫描。如果是的话,那就是问题了,而不是“ tmp表”。如果需要进一步讨论,请为所有三个表提供
SHOW CREATE TABLE
。关于mysql - 如何避免花时间在MySQL中创建tmp表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31056358/