Я изучаю добавление составного индекса в таблицу в базе данных MYSQL, которая, вероятно, будет иметь несколько миллионов строк. Компонент будет состоять из двух столбцов varchar, а также трех столбцов int. Мой вопрос сформулирован в названии: существует ли оптимальный порядок создания этого составного индекса? Например, одна из строк int, вероятно, будет иметь только 6 возможных значений, было бы лучше, если бы этот столбец был ближе к определению индекса? Аналогично, одна из столбцов varchar, вероятно, будет иметь миллионы разных значений, если она находится рядом с передним или задним индексом определения?
Существует ли оптимальный метод для заказа составного индекса MYSQL?
Ответ 1
Как правило, в индексе с несколькими столбцами вы хотите, чтобы столбцы с наивысшей мощностью или, другими словами, наибольшее количество различных значений, приходили первым в индекс.
Чтобы быть более точным, сначала нужно, чтобы столбец с наименьшим количеством совпадений соответствовал вашим критериям поиска, чтобы вы могли сузить результирующий набор как можно больше, но в целом он такой же, как и самая высокая мощность.
Итак, в вашем примере вам понадобится столбец, в котором будут иметь миллионы различных значений в индексе перед тем, у которого всего 6 различных значений.
Предполагая, что вы выбираете только одну строку из миллионов значений, она позволяет быстрее удалять больше строк.
При рассмотрении двух столбцов с одинаковой мощностью сначала помещаем меньший (столбцы INTEGER перед столбцами VARCHAR), потому что MySQL может быстрее сравнивать и перебирать их быстрее.
Одно из предостережений заключается в том, что если вы выбираете диапазоны (например, WHERE datecol > NOW()
), то вы хотите, чтобы столбцы диапазона были справа от вас, а столбцы с одной константой (например, WHERE id = 1
) слева. Это связано с тем, что ваш индекс может использоваться только для поиска и упорядочивания до точки первого значения диапазона.