Правильная индексация MySQL - PullRequest
1 голос
/ 30 января 2012

Что касается индексации, уместно ли индексировать все поля, в которых будет выполняться поиск (в пределах предложения WHERE), чтобы ускорить SELECTS?Например, моя база данных содержит таблицу профилей, в которой хранятся такие данные пользователя, как имя, intrestCode, zip, описание и электронная почта.Запись профиля идентифицируется столбцом PRIMARY id, который однозначно соответствует идентификатору пользователя.Я сделал zip и intrestCode индексом, так как профили будут искать по zip и, возможно, intrestCode (SELECT `blah`,`blah`... FROM profile WHERE zip=?, SELECT `blah`,`blah`... FROM profile WHERE zip=? && intrestCode=?).Я правильно делаю?

Ответы [ 4 ]

3 голосов
/ 30 января 2012

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

CREATE INDEX `zip` ON `profile` (`zip`);
CREATE INDEX `intrestCode` ON `profile` (`intrestCode`);

тогда запрос

SELECT `blah`,`blah`... FROM profile WHERE zip=? && intrestCode=?

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

CREATE INDEX `zip+intrestCode` ON `profile` (`zip`, `intrestCode`);

MySQL может использовать это для запросов, которые используют либо zip отдельно в предложении WHERE, либо оба zip и intrestCode, но не для запросов, которые используют только intrestCode в предложении WHERE.

(Это потому, что каждый индекс покрывает всю таблицу. Если бы MySQL попытался найти zip и intrestCode из разных таблиц, то он извлек бы множество ненужных строк из второго индекса. Следовательно, он смотрит только на один индекс. Если вы хотите, чтобы он использовал индекс для обоих столбцов, необходимо иметь один индекс, который включает оба столбца.)

1 голос
/ 30 января 2012

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

Однако помните, что MySQL может одновременно использовать только один индекс из таблицы. Вот почему вы можете поместить индекс на несколько столбцов одновременно. И MySQL может использовать многостолбцовый индекс, если ему нужны только столбцы в начале индекса. В вашем примере я бы собрал многоколонный индекс zip и intrestCode, потому что это поможет обоим запросам. Таким образом, вам не нужен отдельный индекс только для zip.

0 голосов
/ 30 января 2012

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

Допустим, у вас есть два столбца A и B и индекс двух столбцов в порядке A, а затем B. Есть три случая:

  1. Где предложение для столбца A: индекс используется
  2. Где предложение для столбца B: индекс НЕ используется
  3. Где предложение для столбцов A и B: индекс используется

Как говорит staticsan, индексирование - это искусство, и нет правил, которые бы применялись в 100% случаев.Используйте план объяснения, чтобы увидеть, как выполняется ваш запрос, и внести соответствующие изменения.

0 голосов
/ 30 января 2012

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

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