Должен ли я определить индекс (A) и индекс (B), или индекс (A, B), или оба? - PullRequest
6 голосов
/ 21 марта 2012

В моей таблице есть два тесно связанных столбца A и B. Какие возможные соображения я должен сделать, чтобы решить, создавать ли:

  • index (A) и index (B),
  • index (A, B),
  • оба вышеупомянутых?

Как это изменится, если I:

  1. использовать только такие запросы, какwhere A = 5 and B = 10 (и никогда не как where A = 5),
  2. также используют запросы типа where A > 3 and A < 10 and B > 12 and B < 20,
  3. часто используют order by (A, B),
  4. часто используют group by (A, B)?

Примечание. Я намеренно не предоставил более подробную информацию о моем конкретном случае, поскольку хочу получить общий ответ, который также будет полезен другим.Я использую mysql, но если вы дадите более общий ответ, который охватывает SQL в целом, это было бы здорово.

Ответы [ 3 ]

5 голосов
/ 21 марта 2012

Хорошо, когда у вас есть индекс (A, B), MySQL также может использовать его в качестве индекса (A). Объявление AB и A не имеет смысла. Объявление AB и B делает, однако

Итак, у вас есть следующие варианты:

  1. Индекс (А, В)
  2. Индекс (A, B) и Индекс (B)
  3. Индекс (A) и Индекс (B)
4 голосов
/ 21 марта 2012

Если вы всегда используете оба столбца (или первый индекс) в вашем WHERE / GROUP BY / ORDER BY, вы должны использовать index(A,B).

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

Так что, если вы никогда не используете Bсамо по себе, тогда index(A,B) должно быть достаточно.Если вы никогда не используете A самостоятельно, но используете B, тогда выполните index(B,A).Если вы используете оба отдельно, но в основном вместе, то добавьте другой индекс отдельно.

2 голосов
/ 21 марта 2012

Индекс на (A,B) будет обрабатывать ваши случаи 1, 3 и 4.

Для случая 2, когда у вас есть запрос диапазона на A, а также на B, лучше иметьиндекс на (A) и отдельный индекс на (B), и пусть база данных решит, что лучше всего подходит для запроса.Он может на лету решить, какой индекс будет более избирательным, основываясь на значениях в запросе.В этом случае MySQL будет использовать только один индекс, поэтому он выберет тот, который, по его мнению, даст ему наименьший набор строк для данного диапазона, а затем пройдет через эти строки, фильтруя по другому диапазону.

Поэтому для обработки всех упомянутых вами случаев я рекомендую индексы:

  • (A,B)
  • (B)

Индекс на (A,B) можно использовать так же, как индекс только на (A) всякий раз, когда базе данных требуется индекс только на (A), поэтому определение этих двух индексов аналогично наличию набора «все вышеперечисленное» (A), (B)и (A,B).

Также обратите внимание, что если вы когда-нибудь захотите упорядочить по или сгруппировать по (B, A), вам понадобится индекс как (B,A), так и (A,B).Заказ важен!

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