【问题标题】:Query Optimizing with 3 tables使用 3 个表进行查询优化
【发布时间】:2012-08-16 00:26:02
【问题描述】:

希望优化此查询

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% 之类的状态时,查询加载正常,但由于我添加了要显示的其他状态,因此出现超时错误。

【问题讨论】:

  • 你试过索引状态表吗?另外,给我们表格的结构
  • 是的,主 gwt 表已建立索引。我已经编辑了我原来的问题。

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


【解决方案1】:

我会建议以下内容。

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

  • gwt.csp
  • gm.mid

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

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

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

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

“csp”是一对一的关系吗?如果不是,您可能会遇到创建巨大结果集的查询的问题。

【讨论】:

  • 我不得不通过删除过时的记录来减小 gws 表的大小。它现在加载,没有那么快,但你的建议是把我推向正确的方向。谢谢!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-08-08
    • 2013-02-05
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    相关资源
    最近更新 更多