【问题标题】:How can I improve query performance based off explain/indexing如何根据解释/索引提高查询性能
【发布时间】:2015-02-24 02:48:31
【问题描述】:
SELECT journey.code
FROM journey
JOIN journey_day ON journey_day.journey = journey.code
JOIN pattern ON pattern.code = journey.pattern
JOIN link ON link.section = pattern.section
WHERE journey_day.day = 5 AND TIME(NOW()) BETWEEN journey.departure AND journey.end
GROUP BY journey.code

上面的查询平均需要 500ms-1s。这是解释的截图:http://i.imgur.com/YqSdrAH.png

我不知道为什么要花这么长时间,我正在尝试优化查询,使其执行

遗憾的是,SQL Fiddle 目前似乎在构建示意图/查看 Fiddles 方面存在技术问题,因此我将尝试描述下面设置的索引:

索引:

  • journey.pattern
  • journey.departure
  • journey.end
  • pattern.code
  • pattern.section
  • link.section

独特:

  • journey.code
  • journey_day.journey + Journey_day.day

关于为什么会发生这种情况的任何想法?

【问题讨论】:

  • 您的查询正在从journey 表中检索一列。 where 条件和group by 仅在该表和journey_day 上。其他表是做什么用的?
  • @GordonLinoff 在我的生产查询中,我选择的不止于此,但在我测试时它对查询速度没有影响,所以我把它排除在外以保持简单

标签: mysql sql optimization innodb


【解决方案1】:

需要提及的几项......您似乎在各个列上都有索引,而不是多个字段的复合单个索引,最特别是旅程表。我建议以下索引如下

journey  (departure, end, code, pattern )
journey_day ( journey, day )
pattern (code)
link (section)

其次,您只是从旅程表中获取代码,但并没有真正从模式或链接表中做任何事情,所以我不知道您为什么将它们包含在查询中并且可以简化为

SELECT DISTINCT j.code 
   FROM journey j 
   JOIN journey_day jd 
        ON j.code = jd.journey 
        AND jd.day = 5 
   WHERE 
      TIME(NOW()) BETWEEN j.departure AND j.end 

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多