Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql查询速度慢得令人麻木_Mysql_Performance_Innodb - Fatal编程技术网

Mysql查询速度慢得令人麻木

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 *

我对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 * 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!我已经用你的解决方案和另一个编辑更新了这个问题。也感谢伟大的链接!