选择没有连接数据的事件的最快方法

Posted

技术标签:

【中文标题】选择没有连接数据的事件的最快方法【英文标题】:Fastest way to Select Event that has no Joined Data 【发布时间】:2013-11-13 04:42:12 【问题描述】:

我有两张桌子:

Event
ID, StartTime

Video
ID, StartTime, Endtime

我需要找到任何没有视频的活动。

为此,我得到了以下查询(我已经尝试了很多)

SELECT * FROM
(Select E.*,V.ID FROM Events E LEFT JOIN Video V On E.StartTime >= V.StartTime AND E.StartTime <= V.EndTime) A
HAVING V.ID IS NULL

这似乎产生了正确的数据,但它太慢了......(我在事件中有 100000 条记录,在视频中有 10000 条记录)。这大约需要 2 分钟。我对所有列都有索引

有没有更快的方法来做到这一点?

【问题讨论】:

【参考方案1】:

您是否尝试过删除子查询?

SELECT E.*
FROM Events E 
LEFT JOIN Video V On E.StartTime >= V.StartTime AND E.StartTime <= V.EndTime
WHERE V.ID IS NULL

或使用NOT EXISTS

SELECT E.*
FROM Events E 
WHERE NOT EXISTS (
  SELECT * FROM Video V WHERE E.StartTime >= V.StartTime AND E.StartTime <= V.EndTime
)

【讨论】:

我认为两个建议中的 join 仍将与原始问题中的 join 顺序相同,即大约十亿 (10,000 x 100,000) 虚拟行。 不会是第二种情况,因为 mysql 不需要存储任何来自 Video 的临时表,因为这些结果会被丢弃。操作员查询的主要问题之一是他将所有可能的组合收集到一个临时表中,然后过滤掉。 感谢Not Exists 稍微快一点:)

以上是关于选择没有连接数据的事件的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

高并发的MySQL数据查询时,会不会选择数据库连接池?

通过慢速网络连接在 git 中工作的最快方法是啥?

IOS / Objective-C:检查互联网连接的最快方法 - 2017 [重复]

JDBC数据库的连接池

数据库连接池的Java连接池

MySQL的连接数