Как создать индекс для таблицы с комбинированным первичным ключом?

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

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

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

2 ответов


Многоколоночные Индексы

для многоколоночного индекса индекс работает слева направо.

учитывая ваш первичный ключ:

(col_a, col_b)

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

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

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

(col_a, col_b, col_c)
  • столбец col_a: да
  • столбец col_a & col_b: да
  • col_a & col_b & col_c: да
  • столбец col_a & col_c: нет. Нельзя пропустить col_b в индексе.
  • col_b:: нет. Не могу пропустить столбец col_a.
  • col_c:: нет. Не могу пропустить столбец col_a.
  • col_b & col_c: нет. Нельзя пропустить 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.

первичный Ключи в индексах "покрытие"

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

индекс одного столбца, поскольку он относится к индексу покрытия, можно рассматривать как индекс нескольких столбцов в следующем шаблоне. Учитывая первичный ключ (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.


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