Существует ли оптимальный метод для заказа составного индекса MYSQL?

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

Ответ 1

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

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

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

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

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

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