繁体   English   中英

内部联接的慢where子句

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM