Есть ли оптимальный способ заказа составного индекса MYSQL?

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

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам