如何根据解释/索引提高查询性能

时间:2014-12-26 23:43:08

标签: mysql sql optimization innodb

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

我无法弄清楚为什么要花这么长时间,我正在尝试优化查询,以便执行< = 100ms。

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

INDEX:

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

UNIQUE:

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

有关为何发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:0)

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

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