Индексируются ли составные уникальные ключи в MySQL? - СУБД - PullRequest
1 голос
/ 03 февраля 2020

У меня есть таблица UserSkills с тремя столбцами: id (PK) , userId (FK) и skillId (FK) .

Я хочу применить составное ограничение уникальности для комбинации userId и skillId. А для более быстрого поиска я хочу составную индексацию по (userId, skillId).

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

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

Если таблица имеет многостолбцовый индекс, любой крайний левый префикс индекса может использоваться оптимизатор для поиска строк. Например, если у вас есть индекс из трех столбцов (col1, col2, col3), у вас есть индексированные возможности поиска для (col1), (col1, col2) и (col1, col2, col3).

В двух словах, я хочу выяснить, должен ли я создавать многостолбцовый индекс (userId, skillId) после объявления вышеупомянутого многостолбцового уникального ограничения, связанного с ними, или это будет просто избыточно и, следовательно, не требуется.

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Таким образом, для ваших полей id (PK), userId (FK) и skillId (FK), mysql автоматически создаст индекс для (id) (уникальный) и индекс для (userId) (неуникальный) и индекс на (skillId) (неуникальный).

Вам все еще нужен дополнительный уникальный индекс на (userId, skillId).

Это может заменить неуникальный индекс на (userId), поскольку оптимизатор может использовать индекс (userId, skillId) всякий раз, когда ему нужно найти значение userId. Однако создание и удаление индексов, когда индекс используется внешним ключом в mysql, может быть громоздким, поэтому вы можете просто захотеть добавить составной уникальный индекс.

1 голос
/ 03 февраля 2020

Q: want to know if MySQL indexes composite unique keys as well. And if it does, is it treated as a normal multi-column index or not

Да, см .:

MySQL требует индексирования столбцов внешнего ключа; если вы создаете таблицу с ограничением внешнего ключа, но без индекса для данного столбца, создается индекс. Исключение: кластеру NDB требуется явный уникальный ключ (или первичный ключ) для столбца внешнего ключа.

https://dev.mysql.com/doc/refman/5.6/en/constraint-foreign-key.html

Комментарий FloridaDBA:

Just add a unique index on the two fields. CREATE UNIQUE INDEX index_name ON table_name(index_column_1,index_column_2,...)

Это возможно, но я не буду рекомендовать "просто" делать это, потому что, как указано в руководстве, это так.

любой крайний левый Префикс индекса может использоваться оптимизатором для поиска строк

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

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

Для получения дополнительной информации об этом прочитайте эту статью и изучите приведенные примеры.

https://dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html

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