[英]Slow where clause on inner join
SELECT journey.id
FROM journey
JOIN journey_day ON journey_day.journey = journey.id
JOIN service ON journey.service = service.id
JOIN operator ON operator.id = service.operator
JOIN pattern ON pattern.id = journey.pattern
JOIN pattern_link pl ON pl.section = pattern.section AND pl.from_stop = "370023292"
JOIN pattern_link pl2 ON pl2.section = pl.section AND pl2.from_sequence < pl.from_sequence
WHERE CURDATE() BETWEEN service.date_start and service.date_end AND operator.id = "TMTL"
Above is an SQL query that takes on average 0.1 - 0.3 seconds to run.
出于某种原因,我将AND journey_day.day = 3
附加到WHERE子句后AND journey_day.day = 3
执行时间增加4秒钟。 出于这个原因,我要发布此问题。
trip_day表中的每一列都有某种索引。
id(INT 11) | journey(VARCHAR 128) | day(TINYINT 1)
id是主键,旅程和日期列均已编制索引。 联接该表完全没有问题,但是只要WHERE子句质疑该表,执行时间就会大大增加。
journey_day
表仅用于确定旅程的运行日期。 例如,如果某个旅程在星期三和星期四运行,则该旅程的标识符将在旅程列中,然后是3,在另一行中是相同的事物,但带有4。
任何想法为什么执行时间如此巨大的延迟正在发生?
查询之前会添加EXPLAIN的结果: http : //i.imgur.com/QrjZEHy.png
检查已索引或调节了多少个字段。 最有可能的是,travel_day.day未建立索引,因此对其进行过滤非常慢。
检查查询的一种方法是在MySQL控制台上运行[EXPLAIN][1]
:
EXPLAIN <yourquery>
它将为您提供有关查询运行方式,要检查的行数以及是否使用相关表索引的详细计划。
您还可以做的( 可能有帮助但不能保证)是将整个查询包装到该过滤器中,以便将其应用于第一个查询的结果。
SELECT journey.id FROM (
SELECT journey.id id, journey_day.day jday
FROM journey
JOIN journey_day ON journey_day.journey = journey.id
JOIN service ON journey.service = service.id
JOIN operator ON operator.id = service.operator
JOIN pattern ON pattern.id = journey.pattern
JOIN pattern_link pl ON pl.section = pattern.section AND pl.from_stop = "370023292"
JOIN pattern_link pl2 ON pl2.section = pl.section AND pl2.from_sequence < pl.from_sequence
WHERE CURDATE() BETWEEN service.date_start and service.date_end AND operator.id = "TMTL") qq
WHERE qq.jday=3;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.