Порядок столбцов в многостолбцовом индексе в MySQL - PullRequest
16 голосов
/ 24 января 2011

Я пытаюсь понять, что лучше при определении многостолбцовых индексов:

  • Сначала ставить наиболее селективный столбец (более высокая мощность, для скорости?);или
  • Поместив сначала менее селективный столбец (Меньшее количество элементов для сжатия индекса?)

Или, может, это зависит от того, оптимизирую ли я скорость или пространство?

Ответы [ 3 ]

9 голосов
/ 24 января 2011

Порядок столбцов должен соответствовать порядку, в котором столбцы запрашиваются позже, иначе MySQL не будет их использовать.Это вопрос, о котором вы должны задуматься.

Подробнее здесь .

ОБНОВЛЕНИЕ:

Для вашего вопроса о количестве элементов можно прочитать это .Это похоже на ваш вопрос?Это отвечает на это?

4 голосов
/ 24 января 2011

Всегда ставьте самый селективный столбец в начале, очень редко есть причина для обратного.

или, может, все зависит от того, оптимизирую ли я скорость или пространство?

Позвольте мне сказать это так. Какой смысл использовать меньше памяти, если это вызывает индекс not to be used at all? Индекс низкой мощности (в порядке столбцов) обычно не используется, если он не является индексом покрытия для запроса, потому что будет очень дорого возвращаться к данным для других столбцов.

Смысл индексов состоит в том, чтобы помочь запросу, и их правильное расположение (количество элементов) всегда должно быть в первую очередь.

0 голосов
/ 11 июля 2018
WHERE person_id = 123 AND country_code = 'AT'

Использование

INDEX(person_id, country_code)  -- in EITHER order!

Существует нет разница в скорости или места для порядка столбцов индекса в this case.

Да, у MyISAM было "сжатие индекса", но оно больше не используется.

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

INDEX(person_id)  -- is better than
INDEX(country_code)

Но ни один из них не так хорош, как составной индекс.

Для

WHERE person_name LIKE 'James%' AND country_code = 'UK'

лучший показатель равен

INDEX(country_code, person_name)   -- in THIS order!

Порядок в WHERE не влияет на оптимизацию.

Дополнительные советы и обсуждение: http://mysql.rjweb.org/doc.php/index_cookbook_mysql

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