1

我在使用 InnoDB mysql 数据库时遇到问题。例如,我有两个表,事件和 events_artists 具有以下架构:

events:
id (PK)
host_id
date

events_artists:
id (PK)
event_id
artist_id

表 events 有大约 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;

但是,主要的速度提升是添加外键。我不得不在中间删除它们以进行一些重复的搜索并现在将它们添加回来,这大大提高了速度。虽然查询之前需要一个多小时,但现在只需要一秒钟

谢谢!

查尔斯

4

3 回答 3

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 上有索引,以便更快地执行查询。

于 2012-07-23T09:54:06.813 回答
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
于 2012-07-23T09:54:44.100 回答
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
于 2012-07-23T09:58:45.157 回答