我有以下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_idhost之间的url是否不同?

code是否具有PRIMARY KEY(account_id)?那就是优化器要开始的地方。

请提供EXPLAIN SELECT ...,以便我们查看它是否在进行任何表扫描。如果是的话,那就是问题了,而不是“ tmp表”。

如果需要进一步讨论,请为所有三个表提供SHOW CREATE TABLE

关于mysql - 如何避免花时间在MySQL中创建tmp表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31056358/

10-11 20:58