Как я могу создать индекс для таблицы с объединенным первичным ключом? - PullRequest
6 голосов
/ 22 февраля 2012

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

Мои вопросы: как мне создать индекс для него? Мне понадобится только один составной индекс или три индекса с двумя индексами для разделенных столбцов?

Я думаю, что MYSQL создаст индекс для первичного ключа. Но создаст ли он составной индекс для (col_a, col_b) или индекс для каждого столбца?

Ответы [ 2 ]

8 голосов
/ 22 февраля 2012

Индексы из нескольких столбцов

Для индекса из нескольких столбцов индекс работает слева направо.

Для вашего первичного ключа:

(col_a, col_b)

Вот случаи, когда его можно использовать:

  • col_a : ДА .Индекс можно использовать при поиске по col_a, поскольку начиная с слева направо, col_a является первым столбцом.
  • col_a & col_b : YES .При поиске по col_a и col_b индекс также можно использовать, поскольку начиная слева направо, это col_a, затем col_b.
  • col_b: : NO .При поиске только col_b индекс нельзя использовать, потому что первый столбец в индексе - это col_a, и мы не можем пропускать столбцы.

Учитывая больший индекс, подобный этому:

(col_a, col_b, col_c)
  • col_a : YES
  • col_a & col_b : YES
  • col_a & col_b & col_c : ДА
  • col_a & col_c : NO .Невозможно пропустить col_b в индексе.
  • col_b: : NO .Не могу пропустить col_a.
  • col_c: : NO .Не могу пропустить col_a.
  • col_b & col_c : NO .Не удается пропустить col_a в индексе.

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

Чтобы использовать индекс в качестве индекса "покрытия" ,шаблон слева направо по-прежнему применяется.

Учитывая индекс (col_a, col_b), вы можете выбрать и col_a и col_b, но выполнять поиск только по col_a (или col_a и col_b), а MySQL может использовать индекс какдля поиска и для извлечения данных, потому что col_a и col_b находятся в индексе.Это сохраняет поездку к фактическим данным строки, так как значения хранятся в индексе.

Учитывая индекс (col_a, col_b, col_c), вы не можете ВЫБРАТЬ col_a и col_c, если вы выполняете поиск только по col_a и можетеиспользуйте индекс покрытия для возврата col_c, так как вы не можете пропустить col_b в индексе.Вместо этого MySQL будет посещать фактические данные таблицы.Тем не менее, вы можете ВЫБРАТЬ col_a и col_c и использовать его в качестве индекса покрытия, если вы выполняете поиск по обоим col_a и col_b.

Первичные ключи в индексах "Covering"

Каждый вторичный индекс имеет первичный ключ, включенный в индекс.

Индекс с одним столбцом, поскольку он относится к индексу покрытия, можно рассматривать как индекс с несколькими столбцами в следующем шаблоне.С учетом первичного ключа (col_a, col_b), индекса одного столбца на col_b, действительно выглядит так: (col_b)(col_a, col_b).

С учетом вышеуказанного индекса одного столбца, вы все равно можете выбрать col_a и col_b, выполнить поиск по col_b ииндекс может быть использован в качестве индекса покрытия.Поскольку первичный ключ включает col_a, MySQL все еще может использовать индекс для возврата обоих столбцов, не обращаясь к фактическим данным таблицы.

Что, если я хочу выполнить поиск по col_b?

Учитывая первичный ключ (col_a, col_b), если вы хотите искать только по col_b, вы должны добавить индекс одного столбца в col_b.Как описано выше, он все еще может использоваться как индекс покрытия, если вы возвращаете col_b и col_a.

3 голосов
/ 22 февраля 2012

Составной индекс первичного ключа для (col_a, col_b) позаботится о ситуациях, когда вы запрашиваете оба столбца или запрашиваете только col_a. Для запросов только к col_b вам понадобится отдельный индекс.

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