我有三个名为 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/