Индексы из нескольких столбцов
Для индекса из нескольких столбцов индекс работает слева направо.
Для вашего первичного ключа:
(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.