Стоит добавить индексы для столбца, чтобы сделать их внешним ключом? - PullRequest
1 голос
/ 21 мая 2011

В моей базе данных есть таблица invitations, в которой есть столбцы from и to, которые являются обоими внешними ключами для столбца userId в моей таблице users.

Например, если пользователь № 1 пригласил пользователя № 2 что-то сделать, то в таблице invitations значение from будет равно 1, а значение to будет равно 2.

Я буду использовать столбец to в операторах where, например:

SELECT * FROM invitations WHERE `to` = $currentUserId

Но столбец from никогда не будет использоваться в операторах WHERE.

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

Имеет ли смысл для меня создать индекс для from просто для добавления внешнего ключа?

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

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

Внутренне ваши fkeys будут запускать действие при любой вставке / обновлении / удалении приглашений, но также и при любыхобновление / удаление пользователей (id).

Первый из них будет использовать индекс пользователей (id), чтобы проверить, существует ли пользователь.

Другой по сути будет выполнять запрос, который идет: do whatever you defined to do on update/delete from invitations where to/from = :id.

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

И, как указано в другом ответе, индексы также полезны для запросов с предложением order by / limit.

1 голос
/ 21 мая 2011

Вы должны добавить индекс только для столбцов, которые будут использоваться в операторах WHERE

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

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

Внешние ключи в общем случае не получат преимущества от определения индекса для них, если они не являются частью предложений where / order by.Если они есть, вы должны их проиндексировать.(опять-таки, практические правила).

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

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