sql - 为什么在 MySQL "IN"子句中添加第五个参数会显着降低速度?

标签 sql mysql

我有三个名为 Item、Event 和 Seat 的表,其构造如下:

项目
身份证(整数)
EventId (整数)
部分 (int)

事件
身份证(整数)
VenueId (整数)
配置(整数)
Home_team(国际)

座位
身份证(整数)
VenueId (int)
配置(整数)
部分 (int)

我正在使用以下查询来选择与特定主队相关的所有项目:

SELECT Item.Id
FROM Item
JOIN Event     
ON Event.Id = Item.EventId    
JOIN Seat USING (VenueId, Configuration)    
WHERE Seat.Section = Item.Section    
AND Event.Home_team IN (1,2,3,4)

此查询运行速度非常快 -- 作为引用,大约 0.6 秒。然而,当我在最后一行的 IN 子句中添加额外的参数时:

AND Event.Home_team IN (1,2,3,4,5)

...它变得非常慢——作为引用,它大约需要 24 秒。

我已经尝试更改 IN 子句中的不同参数,但它们是什么并不重要;最多四个时,事情总是运行得很快,但是一旦我添加了第五个,它就会变得慢得多。 Event.Home_team 字段已编入索引。我也尝试用这种形式替换最后一行:

AND (Event.Home_team = 1 OR Event.Home_team = 2 OR Event.Home_team = 3 OR Event.Home_team =4 OR Event.Home_team =5)

而且我发现,就此而言,当有四个选项时,事情运行得很快,但一旦我添加第五个选项,事情就会非常缓慢。

这看起来很奇怪。谁能告诉我为什么会这样?

编辑
评论者要求提供我的 EXPLAIN 声明。在这里:

**id  select_type  table      type    possible_keys                                  keys        key_len   ref           rows     Extra**
  1   SIMPLE       seat       ref     seat_FI_1,seat_FI_2,section..                  exclude     4         const         17147
  1   SIMPLE       event      ref     PRIMARY,home_team,configuration_id, VenueId    VenueId     5         seat.VenueId  1        Using where
  1   SIMPLE       item       ref     FI_2,item_FI_3                                 FI_2        5         event.id      12       Using where

另外,我应该注意 WHERE 语句中有一个附加子句,我最初为简单起见省略了它:

Seat.exclude = 0

Exclude 可以设置为 0 或 1。它也被索引。

最佳答案

尝试通过 SectionID 将 Seat ID 连接到 Item 表,并为 Venue 和 Configuration 使用 WHERE 子句。

SELECT Item.Id
FROM Item
JOIN Event     
ON Event.Id = Item.EventId    
JOIN Seat 
ON Seat.Section = Item.Section   
WHERE Event.Configuration = Seat.Configuration
AND Event.Venue = Seat.Venue  
AND Event.Home_team IN (1,2,3,4,5)

确保您在所有 EventID 和 Section 字段上都有索引。在 Section、Configuration 和 Home_team 字段上建立索引也没有坏处。

关于sql - 为什么在 MySQL "IN"子句中添加第五个参数会显着降低速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1215794/

相关文章:

java - 无法使用 Java/JSP 将数据插入 Apache Derby 数据库

mysql - 将表转换为 0's and 1' s 的矩阵

php - 在查询中使用 $_SESSION ['id' ] 不好吗?

mysql - 我收到错误 #1329 - 无数据 - 在 MySQL 中获取、选择或处理的行为零

mysql错误1364字段没有默认值

Mysql ON UPDATE CURRENT_TIMESTAMP 与更新后将时间设置为 now() 的触发器

sql - 将参数传递给 ref dbt jinja

mysql - 记录/行数等于 2 的条目总数

sql - Oracle TO_CHAR(timestamp) 和timestamp 分秒不同

mysql - 嵌套 GROUP_CONCAT MySQL?