У меня есть три таблицы с именами Item, Event и Seat, сконструированные так:
Пункт
Id (int)
EventId (int)
Раздел (int)
Событие
Id (int)
VenueId (int)
Конфигурация (int)
HOME_TEAM (INT)
сиденье
Id (int)
VenueId (int)
Конфигурация (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)
и я нахожу, что для этого также все происходит быстро, когда есть четыре варианта, но очень медленно, когда я добавляю пятый.
Это похоже на странное поведение. Может кто-нибудь сказать мне, почему это происходит?
EDIT
Комментаторы попросили мое объяснение. Вот оно:
**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
Исключить можно установить на 0 или 1. Он также индексируется.