【问题标题】:Mysql queries mindnumbingly slowMysql 查询速度非常慢
【发布时间】:2012-07-23 09:50:06
【问题描述】:

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

events:
id (PK)
host_id
date

events_artists:
id (PK)
event_id
artist_id

表格 events 大约有 100,000 个条目,events_artists 大约有 150,000 个。

我必须做的一件事是检查表 events 中未在表 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;

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

谢谢!

查尔斯

【问题讨论】:

  • EXPLAIN <your select query here> 说什么?

标签: mysql performance innodb


【解决方案1】:

要获得更快的结果,您应该避免使用子查询。或者,您可以尝试使用 LEFT JOIN 来获取 events 中但 events_artists 中的记录。

访问Visual explanation of joins

SELECT * 
FROM events a
     LEFT JOIN events_artists b
         ON a.id = b.event_id
WHERE b.event_id IS NULL;

还要确保您在列 id 和 event_id 上有索引,以便更快地执行查询。

【讨论】:

  • 谢谢你,Omesh!我已经用您的解决方案和另一个编辑更新了这个问题。也感谢伟大的链接!
【解决方案2】:

如果您运行查询的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

【讨论】:

    【解决方案3】:

    试试这个

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-03
      • 2015-11-21
      • 2017-10-30
      • 1970-01-01
      • 2020-08-14
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多