2012-05-01 20 views
0

我有以下的MySQL查询需要大约3分钟运行。它确实有2个子查询,但表中的行数很少。在做解释时,看起来“使用临时”可能是罪魁祸首。显然,它看起来像数据库正在为所有三个查询创建一个临时表,如下面的“使用临时”标记所述。mysql使用临时表与子查询,但不是按组和按

让我感到困惑的是,MySQL文档说,使用临时数据通常是由group by和order by引起的,我都没有使用它。子查询是否导致一个隐含的组或按顺序?子查询是否导致临时表是必要的,而不管是否按顺序排序?有关如何重构此查询的任何建议,以便MySQL可以更有效地处理它? MySQL设置中的任何其他调整想法?

mysql> explain 
SELECT DISTINCT COMPANY_ID, COMPANY_NAME 
    FROM COMPANY 
WHERE ID IN (SELECT DISTINCT ID FROM CAMPAIGN WHERE CAMPAIGN_ID IN (SELECT 
       DISTINCT CAMPAIGN_ID FROM AD 
       WHERE ID=10 AND (AD_STATUS='R' OR AD_STATUS='T')) 
       AND (STATUS_CODE='L' OR STATUS_CODE='A' OR STATUS_CODE='C')); 

+----+--------------------+----------+------+---------------+------+---------+------+------+------------------------------+ 
| id | select_type  | table | type | possible_keys | key | key_len | ref | rows | Extra      | 
+----+--------------------+----------+------+---------------+------+---------+------+------+------------------------------+ 
| 1 | PRIMARY   | COMPANY | ALL | NULL   | NULL | NULL | NULL | 1207 | Using where; Using temporary | 
| 2 | DEPENDENT SUBQUERY | CAMPAIGN | ALL | NULL   | NULL | NULL | NULL | 880 | Using where; Using temporary | 
| 3 | DEPENDENT SUBQUERY | AD  | ALL | NULL   | NULL | NULL | NULL | 264 | Using where; Using temporary | 
+----+--------------------+----------+------+---------------+------+---------+------+------+------------------------------+ 

谢谢! 菲尔

回答

3

我不知道你的模式的结构,但我会尝试以下方法:

CREATE INDEX i_company_id ON company(id); -- should it be a Primary Key?.. 
CREATE INDEX i_campaign_id ON campaign(id); -- same, PK here? 
CREATE INDEX i_ad_id ON ad(id);    -- the same question applies 
ANALYZE TABLE company, campaign, ad; 

,且查询可以简化如下:

SELECT DISTINCT c.company_id, c.company_name 
    FROM company c 
    JOIN campaign cg ON c.id = cg.id 
    JOIN ad ON cg.campaign_id = ad.campaign_id 
WHERE ad.id = 10 
    AND ad.ad_status IN ('R', 'T') 
    AND ad.status_code IN ('L', 'A', 'C'); 

DISTINCT条款在子查询中,对你来说显着减速的是最后一个就足够了。

+0

非常感谢。以这种方式接近查询完全解决了延迟问题。很惊讶,我没有想到这个查询写得有多笨拙。 –