База данных - индекс по нескольким столбцам - PullRequest
2 голосов
/ 22 декабря 2009

Когда я запускаю команду EXPLAIN в моем запросе MySQL:

EXPLAIN SELECT colZ FROM table1, table 2 
WHERE table1.colA = table2.colA
AND table1.colB = table2.colB
AND table1.colC = X

Команда EXPLAIN утверждает, что possible_keys включает в себя:

colA, colB, colC

Но фактический ключ используется как colA

Вопрос : Значит ли это, что я должен сделать индекс по всем трем объединенным столбцам? Индекс (colA, colB, colC)?

Ответы [ 4 ]

2 голосов
/ 22 декабря 2009

Глядя на ваш запрос, вы получите производительность:

Индекс (ColA, ColB) в таблице2

Индекс (ColA, ColB, ColC, ColZ) в таблице 1

Эти индексы разрешают поиск только по индексу ColZ и должны быть v. Fast

1 голос
/ 22 декабря 2009

Если вы создаете покрывающий индекс - то есть тот, который обеспечивает ядру базы данных возможность извлекать всю необходимую информацию из одного индекса - тогда это должно облегчить жизнь оптимизатору. В вашем случае необходимо охватить столбцы в предложении WHERE (индекс на colA, colB, colC в table1; другой на colA, colB в table2 ).

Управление этим индексом / индексами потребует определенного количества накладных расходов, но будут ли преимущества, связанные с дополнительным обслуживанием, зависеть от вашей настройки (INSERT против SELECT и т. Д.)

1 голос
/ 22 декабря 2009

Да, я рекомендую вам создать Комбинированный индекс

0 голосов
/ 22 декабря 2009

Правильный ответ зависит от селективности различных столбцов. В частности, сколько различных значений существует для table1.col1C? Если во всей таблице имеется всего два значения (например, «M» и «F»), то лучше даже не включать их в объединенный индекс. Если, однако, существует примерно треть различных значений в col1C, поскольку в table2 есть строки, то вполне возможно, что индекс только для table1.col1C даст ослепительно быстрые результаты.

Если оптимизатор может найти три строки в таблице 1 без каких-либо объединений, а затем выполнить объединение поиска три раза, чтобы получить совпадающие строки в таблице 2, это будет очень и очень быстро.

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

Вот хорошая новость: вы всегда можете изменить дизайн индекса позже.

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