MySQL: уникальная оптимизация производительности нескольких столбцов

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

У меня есть таблица, которая просто: tableA_id tableB_id

Мой первичный ключ - это уникальное ограничение для обеих таблиц, и у меня есть индекс для обоих столбцов. Оба также являются первичными ключами к своим уважаемым таблицам.

Если таблица А может иметь, скажем, 10 000 000 строк, а таблица В - 2 000 000 строк, более вероятно, что Таблица B будет находиться в этом ограничении гораздо меньше раз. Как это ни печально, является ли это более оптимизированным, когда я устанавливаю свое уникальное ограничение, чтобы поместить TableB в качестве первого столбца, так как там меньше искать, TableA (если так, почему), или это не имеет значения, так как он не ищет сначала один, затем другой, скорее идет один за другим, глядя на обоих.

заранее спасибо

2 ответа

Решение

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

Форма цитаты MySQL документы:

Исключить ряды из рассмотрения. Если есть выбор между несколькими индексами, MySQL обычно использует индекс, который находит наименьшее количество строк (самый селективный индекс)

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

Из вашего описания я предполагаю, что у вас есть следующее:

UNIQUE (tableA_id, tableB_id)
INDEX (tableA_id)
INDEX (tableB_id

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

Я не думаю, что оптимизатор MySQL достаточно умен, чтобы использовать индекс PK для оператора, который содержит WHERE tableB_id = 42,

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

Если вы всегда запрашиваете эту таблицу, используя оба идентификатора, нет необходимости сохранять индекс для одного столбца.

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