【问题标题】:Optimising WHERE subquery inside JOIN subquery在 JOIN 子查询中优化 WHERE 子查询
【发布时间】:2014-08-08 10:23:58
【问题描述】:
SELECT journey.departure AS startTime, departure.duration AS seconds, ADDTIME(journey.departure, departure.duration) AS departureTime, p.section
FROM journey
JOIN journey_day ON journey_day.journey = journey.id
JOIN pattern p ON p.id = journey.pattern
JOIN (
    SELECT departure.section, SEC_TO_TIME(SUM(time)) AS duration
    FROM pattern_link departure
    WHERE departure.from_sequence < (SELECT from_sequence FROM pattern_link WHERE from_stop = "1980SN12532B" AND section = departure.section)
    GROUP BY departure.section
) departure ON departure.section = p.section
WHERE journey.service = "44-A-A-y10-1" AND p.direction = "inbound" AND journey_day.day = 4
GROUP BY journey.id
ORDER BY departure

这个查询需要很长时间才能运行。这是因为JOIN 子查询内的WHERE 子句中的子查询。问题是,我不知道该怎么写。在离开连接的WHERE 语句中,我需要知道from_sequence 数字(基本上是一个ID),我能做到这一点的唯一方法是根据WHERE 子句中的条件进行查询。

有什么想法吗?

【问题讨论】:

  • 在join子查询中使用join而不是子查询?? pattern_link 和 pattern_link_departure 之间有什么关系吗?
  • @Torrezzzz 我试试看,不知道你说的 pattern_link_departure 是什么意思,如果你再看一遍,你会发现离开只是 pattern_link 表的别名
  • 我的错误没有注意到...使用 join 它可能会稍微加快查询...。

标签: mysql sql join optimization subquery


【解决方案1】:

您的版本将受益于pattern_link(section, from_stop, time) 上的索引。该索引可能是改进查询的最简单方法。

您也可以尝试使用聚合将其写为显式 join

SELECT departure.section, SEC_TO_TIME(SUM(time)) AS duration
FROM pattern_link departure JOIN
     (SELECT section, from_sequence
      FROM pattern_link
      WHERE from_stop = '1980SN12532B'
     ) s
     ON s.section = departure.section
WHERE departure.from_sequence < s.from_sequence
GROUP BY departure.section

【讨论】:

  • 谢谢戈登。有什么方法可以调整您的查询,使其仍然包含原始的FROM journey,或者您是否删除了它以表明应该在单独的查询中完成?
  • @jskidd3 。 . .这只是子查询,这是您提出问题的基础。
猜你喜欢
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多