如何优化此连接查询?

时间:2011-08-05 01:20:50

标签: mysql optimization join indexing group-by

以下是我之前关于优化sql join的经验:

在MySQL中,为了快速加入,通常我会避免输入'All'。基本上,如果表中包含索引字段,则连接速度会更快。即使您使用WHERE子句等来创建较小的子集,如果两个子集没有连接索引,该查询必须比索引的完整表连接慢得多,然后应用WHERE子句等..来获取最终结果集

但是,如何优化这种查询?

我必须选择要加入的子集。在这种情况下,那些派生的子集将没有连接索引。

以下是我遇到的具体问题:

我有一个名为Contract的表,它有以下字段(为了简化,实际上是更多的字段):

SN, type, date, flag

SN和type是它的主键,flag字段可以是0/1/2

这是我创建的连接查询:

SELECT f0_crt.SN, f0_crt.f0_Info, f1_Info
FROM 
  (SELECT a.SN, GROUP_CONCAT(a.type, '-', a.date SEPARATOR '*') as f0_Info
   FROM Contract a
   WHERE a.flag=0 
   GROUP BY SN
   ORDER BY SN ) AS f0_crt
  LEFT JOIN 
  (SELECT b.SN, GROUP_CONCAT(b.type, '-', b.date SEPARATOR '*') as f1_Info
    FROM Contract b
    WHERE b.flag=1 
    GROUP BY SN
    ORDER BY SN ) AS f1_crt
    ON f0_crt.SN=f1_crt.SN
基本上,我需要将结果设置为:

SN                  f0_Info                              f1_Info
abc        COMB-20100911*CDMA-20090701        FFIV-20100911*SPRT-20090701

以下是EXPLAIN结果:

id  select_type   table     type    possible_keys   key key_len ref rows    Extra
---------------------------------------------------------------------------------------------
1   PRIMARY      derived2    ALL           (NULL)    (NULL) (NULL)    (NULL)    15052    
1   PRIMARY      derived3    ALL           (NULL)    (NULL) (NULL)    (NULL)    29407    
3   DERIVED         b      index    seq_num_index   PRIMARY    184  (NULL)  81982    
2   DERIVED         a       index   seq_num_index   PRIMARY    184  (NULL)  81982    

这实际上是EXPLAIN结果,我认为缓慢的关键原因是:两个ALL连接。但是,我不知道如何在这里避免它?有没有办法获得我需要的组格式,然后与SN连接,以便可以使用SN索引...?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您将查询修改为这样的内容怎么办?

SELECT a.SN, GROUP_CONCAT(a.type, '-', a.date SEPARATOR '*') as f0_Info,
       GROUP_CONCAT(b.type, '-', b.date SEPARATOR '*') as f1_Info
  FROM Contract a
  LEFT JOIN Contract b
      on a.SN = b.SN and b.flag = 1
  WHERE a.flag=0 
  GROUP BY a.SN
  ORDER BY a.SN