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

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

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

id PK | giver_id FK | recipient_id FK | дата

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

SELECT...WHERE giver_id = x AND recipient_id = t.

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

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

Ответ 1

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

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

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

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

Ответ 2

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

ALTER TABLE your_table ADD INDEX (giver_id, recipient_id);

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

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

Ответ 3

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

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

Ответ 4

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