查询使用3个表进行优化

时间:2012-08-20 16:40:41

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

希望优化此查询

SELECT gwt.z, gwt.csp, gwt.status, gwt.cd, gwt.disp, gwt.5d, gwt.6d, gwt.si, gwt.siad, gwt.prbd, 
  CONCAT(gwt.1, gwt.2, gwt.3, gwt.4, gwt.5, gwt.6, gwt.7, gwt.8, gwt.9), 
  group_concat(gws.res order by line_no), gwt.scm, gm.me, gwt.p, gwt.scd 
from gwt 
left outer join gws on gwt.csp = gws.csp 
left join gm on gwt.scm = gm.mid 
where gwt.zone = 1 
  and (status like '1%' or status like '2%' or status like '3%' or 
       status like '4%' or status like '5%' or status like '6%') 
group by gwt.csp

使用EXPLAIN,gwt有4110行,gws有920k行,gm有2800行。

当我只查询1%的状态时,查询加载正常,但由于我添加了其他状态以显示,我收到超时错误。

describe

2 个答案:

答案 0 :(得分:2)

我建议如下。

确保每个表都有一个与其主键相似的索引:

  • gwt.csp
  • gm.mid

对于gwt,在(zone,status)上创建另一个索引并将连接条件更改为:

gwt.zone = 1 and status >= '1' and status < '7'

这相当于您的列表,但它将允许执行引擎使用索引。

这可能足以修复查询。最后,你可以在gws.csp上放一个索引,看看是否会加快速度。

“csp”是一对一的关系吗?如果不是,那么创建巨型结果集的查询可能会出现问题。

答案 1 :(得分:1)

由于 gws 表的行数比其他表多两个数量级,因此需要关注这一行。如果要设计索引以定位此特定查询,则第一步很简单。也就是说,您需要在连接列(gws.csp)上添加索引,并确保在索引中包含所有选定的列 - gws.res和gws.line_no(?) - 。

以上内容可以显着提高查询速度。第二个问题是确保 gwt 表具有 status 的索引作为第一列。