以下是我之前关于优化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索引...?
谢谢!
答案 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