Есть ли оптимальный способ заказа составного индекса MYSQL? - PullRequest
15 голосов
/ 02 марта 2012

Я смотрю на добавление составного индекса к таблице в базе данных MYSQL, которая, вероятно, будет иметь размер в несколько миллионов строк. Композит будет состоять из двух столбцов varchar, а также трех столбцов int. Мой вопрос, как указано в заголовке: существует ли оптимальный порядок, в котором можно создать этот составной индекс? Например, одна из строк int, скорее всего, будет иметь только 6 возможных значений. Было бы лучше, если бы этот столбец был ближе к началу определения индекса? Аналогично, один из столбцов varchar, вероятно, будет иметь миллионы различных значений, должно ли это быть в начале или в конце определения индекса?

1 Ответ

28 голосов
/ 02 марта 2012

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

Чтобы быть более точным, сначала нужно, чтобы столбец с наименьшим количеством соответствий соответствовал вашим критериям поиска, чтобы вы могли максимально сузить набор результатов, но в целом он соответствует наивысшему количеству элементов.

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

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

При рассмотрении двух столбцов с одинаковым количеством элементов сначала поместите меньший столбец (столбцы INTEGER перед столбцами VARCHAR), поскольку MySQL может сравнивать и выполнять их итерацию быстрее.

Одно предостережение заключается в том, что если вы выбираете с диапазонами (например, WHERE datecol > NOW()), то вы хотите, чтобы столбцы диапазонов были самыми дальними справа, а ваши столбцы - с одной константой (например, WHERE id = 1) слева. Это связано с тем, что ваш индекс может использоваться только для поиска и упорядочения до точки первого значения диапазона.

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