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

Я столкнулся со следующим, и я не уверен, что лучше всего.

Рассмотрим следующую таблицу (которая станет большой):

id PK | SELECT ... WHERE giver_id = x AND recipient_id = t FK | ALTER TABLE your_table ADD INDEX ( giver_id , recipient_id ); FK | Дата

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

giver_id,

Каждая такая комбинация будет уникальной в таблице.

Есть ли какая-либо польза от добавления индекса с двумя столбцами по этим столбцам, или два теоретических теории могут быть достаточными / одинаковыми?

sql,mysql,database,performance,indexing,

79

Ответов: 4


91 принят

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

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

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

При выборе индексов вам также необходимо учитывать влияние на вставку, удаление и обновление. Больше индексов = более медленные обновления.


23

Индекс покрытия, такой как:

giver_id

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

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


3

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

Еще одна вещь , чтобы рассмотреть, если вы можете устранить поле PK в этой таблице и определить первичный индекс ключа на giver_idи recipient_idполей. Вы сказали, что комбинация уникальна, так что, возможно, она будет работать (учитывая множество других условий, на которые вы только можете ответить). Как правило, хотя, я думаю, добавленная сложность, которая добавляется, не стоит хлопот.


0

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

SQL, MySQL, базы данных, производительность, индексация,
Похожие вопросы