我遇到了InnoDB mysql数据库的问题。例如,我有两个表,事件和events_artists,具有以下架构:
events:
id (PK)
host_id
date
events_artists:
id (PK)
event_id
artist_id
表事件有大约100,000个条目,events_artists大约有150,000个。
我要做的一件事是检查表events_artists中没有引用的表事件中的条目。为此,我在另一篇文章中收到了查询
SELECT * FROM events WHERE id IS NULL OR id NOT IN (SELECT event_id FROM events_artists)
从逻辑来看,这个查询对我来说很好。但是,它只是非常慢。我现在让它跑了一个小时,但仍然没有结果。那里的东西一定是错的。
我很感激有关如何优化这一点的任何帮助!
由于
查尔斯
解决方案
以下查询使语句更快:
SELECT *
FROM events a
LEFT JOIN events_artists b
ON a.id = b.event_id
WHERE b.event_id IS NULL;
然而,主要的速度提升是添加 外键 。我不得不在过渡期间删除它们以进行一些重复搜索并立即将它们添加回来,这会大大提高速度。虽然查询花了一个多小时,但现在只需 一秒 。
谢谢!
查尔斯
答案 0 :(得分:3)
为了获得更快的结果,您应该避免使用子查询。或者,您可以尝试使用LEFT JOIN来获取事件中但不在events_artists中的记录。
SELECT *
FROM events a
LEFT JOIN events_artists b
ON a.id = b.event_id
WHERE b.event_id IS NULL;
还要确保在列id和event_id上有索引,以便更快地执行查询。
答案 1 :(得分:1)
如果您运行查询的EXPLAIN
,则会看到子查询被视为DEPENDENT
,这意味着它将为events
表中的每一行运行一次因此它很慢。
您可以将其更改为独立:
SELECT events.*
FROM events
LEFT JOIN events_artists ON (events.id = events_artists.event_id)
WHERE events_artists.event_id IS NULL
答案 2 :(得分:1)
试试这个
select
ev.* from events as ev
left join events_artists as ea on ev.id=ea.event_id
where
ea.event_id is null or ev.id is null