Какие поля должны быть проиндексированы вместе? группа по? Сортировать по? - PullRequest
3 голосов
/ 05 октября 2010

Я пытаюсь ускорить запрос, который у меня сейчас есть:

SELECT * 
FROM `events` 
WHERE (field1 = 'some string' or field1 = 'some string') 
    and is_current = true 
GROUP BY event_id 
ORDER BY pub_date

это занимает примерно 30 секунд.

field1 - varchar (150)

Я сейчас индексирую field1, is_current, event_id, pub_data благотворительность, pub_date, is_current и все поля индивидуально ...

Я действительно не уверен, какие поля следует индексировать вместе, когда я удаляю порядок по, запрос обрабатывается примерно до 8 секунд, и если я удаляю и порядок по, и группу по, это меньше 1 секунды. ..

Что именно должно быть проиндексировано в этом случае, чтобы ускорить запрос?

Edit: Я выполнил объяснение по измененному запросу (который больше не включает группу по):

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
    1   SIMPLE  events  range   is_current,field1_2,field1_3,field1_4,field1    field1_3    153     NULL    204336  Using where; Using filesort

Что указывает на использование ключа field1_3: field1 & is_current
Хотя он не использует ключ, который включает эти два поля и pub_date (для упорядочения ..?)

Он также использует FILESORT, что, похоже, является главной проблемой ..

есть идеи, почему он использует сортировку файлов, хотя поле pub_date также проиндексировано (вместе с другими полями)?

Ответы [ 2 ]

1 голос
/ 05 октября 2010

Все, (field1, is_current, event_id, pub_date) в одном индексе.MySQL может использовать только один индекс для объединенной таблицы в запросе.

Используйте EXPLAIN, чтобы увидеть, что произойдет, когда вы это сделаете.

Кроме того, как говорит KoolKabin, *редко хорошая идея.Иногда MySQL копирует строки во временную таблицу;а затем есть расходы на связь.Чем меньше вы у него спрашиваете, тем быстрее все будет работать.

ОБНОВЛЕНИЕ : На самом деле я был неправ.Сожалею.Во-первых, вы не можете в полной мере использовать индексирование, если ваша группировка отличается от вашего заказа.Во-вторых, у вас есть индекс, где ваш код заказа (pub_date) является первым?Если нет, попробуйте, если это исправляет упорядоченность.

0 голосов
/ 06 октября 2010

есть идеи, почему он использует файловую сортировку, хотя поле pub_date также проиндексировано (вместе с другими полями)?

Это связано с тем, что оптимизатор mysql пытается использовать индекс "field1", а вам нужны данные, упорядоченные по pub_date. Если вы используете mysql 5.1 (следующий запрос выдаст ошибку в более ранней версии n), вы можете заставить mysql использовать индекс pub_date для упорядочения, что-то вроде этого

SELECT * 
FROM `events` 
force index for order by (pub_date)
WHERE (field1 = 'some string' or field1 = 'some string') 
    and is_current = true 
GROUP BY event_id 
ORDER BY pub_date
...