Выбор полей в многопольном индексе на MySQL - PullRequest
0 голосов
/ 17 марта 2009

У меня есть запрос MySQL, который я хотел бы оптимизировать:

SELECT min(`topic_id`) FROM `gallery_topics` where `topic_id` > 11 AND `topic_poster` = 5 AND `topic_status` = 0

Я хотел добавить индекс с несколькими полями для оптимизации этого запроса, поэтому я добавил ключ, который я назвал previous_by_author, с этими тремя ключами в следующем порядке:

  1. topic_id
  2. topic_poster
  3. topic_status

Я сделал EXPLAIN этого запроса, ожидая, что запрос EXPLAIN скажет мне, что запрос использует мой новый индекс previous_by_author. Однако EXPLAIN сообщил, что в запросе используется индекс user_start_time, в котором используются следующие два поля: 1. topic_poster и 2. topic_start_time.

Я не понимаю, topic_start_time - это поле времени, которого нет даже в моем запросе!

Вот полный результат запроса EXPLAIN:

id  select_type  table           type   possible_keys      
1   SIMPLE       gallery_topics ref     PRIMARY,user_start_time,previous_by_author

(rows continued)

key              key_len  ref   rows   Extra
user_start_time  8        const 4      Using where

Какие поля я должен использовать в своем индексе с несколькими полями, чтобы мой запрос мог использовать лучший индекс?

1 Ответ

3 голосов
/ 17 марта 2009

Не зная, каковы все доступные индексы, трудно сказать, почему именно один из них был выбран. Но легче понять, почему ваш новый индекс не был выбран : так как у вас есть условие больше чем на topic_id, и индекс хранит значения, отсортированные сначала по topic_id, MySQL придется прочитать в (по крайней мере из индекса) всех строк с topic_id > 11 и проверьте дополнительные условия в предложении WHERE. Лучше поместить topic_id last в многоколоночный индекс, чтобы MySQL сгруппировал значения в индексе по двум условиям равенства; тогда легко проверить условие больше чем.

Кроме того, сколько строк в таблице? Если у вас нет репрезентативных тестовых данных, все ставки на то, что решит планировщик запросов, не принимаются.

Сводка: для оптимизации запросов, точно таких, как вы показываете, попробуйте индекс

  1. topic_status
  2. topic_poster
  3. topic_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...