如何避免花时间在MySQL中创建tmp表

时间:2015-06-25 16:56:23

标签: mysql sql database query-optimization sql-optimization

我有以下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表的任何指针。

1 个答案:

答案 0 :(得分:0)

第一

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_idurlurl_idhost之间的url是否有所不同?

codePRIMARY KEY(account_id)吗?这就是优化器喜欢开始的地方。

请提供EXPLAIN SELECT ...,以便我们查看是否正在进行任何表格扫描。如果是,则 是问题,而不是“tmp表”。

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