Mysql查询速度慢得令人麻木
我对InnoDB mysql数据库有问题。例如,我有两个表,events和events_美工,具有以下架构:Mysql查询速度慢得令人麻木,mysql,performance,innodb,Mysql,Performance,Innodb,我对InnoDB mysql数据库有问题。例如,我有两个表,events和events_美工,具有以下架构: events: id (PK) host_id date events_artists: id (PK) event_id artist_id 表events包含大约100000个条目,events\u artists包含大约150000个条目 我必须做的一件事是检查表events中没有在表events\u中引用的条目。为了做到这一点,我在另一篇帖子中收到了这个问题 SELECT *
events:
id (PK)
host_id
date
events_artists:
id (PK)
event_id
artist_id
表events包含大约100000个条目,events\u artists包含大约150000个条目
我必须做的一件事是检查表events中没有在表events\u中引用的条目。为了做到这一点,我在另一篇帖子中收到了这个问题
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;
然而,主要的速度提升是添加外键。我不得不在进行重复搜索的过程中删除它们,现在又重新添加,这大大提高了速度。虽然查询在一个多小时前完成,但现在只需一秒钟
谢谢大家!
Charles要获得更快的结果,应避免使用子查询。或者,您可以尝试使用LEFT JOIN来获取事件中但不在事件中的记录 拜访
还要确保列id和事件id上有索引,以便更快地执行查询。要获得更快的结果,应避免使用子查询。或者,您可以尝试使用LEFT JOIN来获取事件中但不在事件中的记录 拜访
还要确保在列id和事件id上有索引,以便更快地执行查询。如果运行查询的
解释,您将看到子查询被视为依赖的,这意味着它将对事件
表中的每一行运行一次,因此速度很慢
您可以将其更改为独立,如下所示:
SELECT events.*
FROM events
LEFT JOIN events_artists ON (events.id = events_artists.event_id)
WHERE events_artists.event_id IS NULL
如果运行查询的EXPLAIN
,您将看到子查询被视为相关的
,这意味着它将为事件
表中的每一行运行一次,因此速度较慢
您可以将其更改为独立,如下所示:
SELECT events.*
FROM events
LEFT JOIN events_artists ON (events.id = events_artists.event_id)
WHERE events_artists.event_id IS NULL
试试这个
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
试试这个
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
EXPLAIN
说什么?EXPLAIN
说什么?谢谢你,Omesh!我已经用你的解决方案和另一个编辑更新了这个问题。也感谢伟大的链接!谢谢你,Omesh!我已经用你的解决方案和另一个编辑更新了这个问题。也感谢伟大的链接!