Должен ли я также индексировать столбцы, включенные в ПЕРВИЧНЫЙ КЛЮЧ? - PullRequest
4 голосов
/ 02 февраля 2010

Этот вопрос неожиданно возник в моей голове ... У меня есть таблица, которая связывает две другие таблицы на основе их идентификатора. CREATE TABLE выглядит так:

CREATE TABLE `ticket_contact` (
        `ticket_id` INT NOT NULL,
        `entity_id` INT NOT NULL,
        `notify` INT NOT NULL DEFAULT 0,
        PRIMARY KEY (`ticket_id`, `entity_id`),
        KEY `ticket_id` (`ticket_id`),
        KEY `entity_id` (`entity_id`)
      )

Мне интересно, есть ли необходимость включать эти последние две строки KEY. Даст ли мне улучшенную скорость выполнения следующих запросов, или отдельные столбцы в пределах PRIMARY KEY будут автоматически проиндексированы?

SELECT * FROM ticket_contact WHERE ticket_id=1;
SELECT * FROM ticket_contact WHERE entity_id=1;

Ответы [ 2 ]

9 голосов
/ 02 февраля 2010

Индекс, созданный PRIMARY KEY, такой же, как и любой другой (потенциально составной) UNIQUE индекс. Поэтому вам не нужно создавать отдельный индекс для ticket_id, поскольку он включен в качестве основного столбца в индекс (ticket_id, entity_id).

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

4 голосов
/ 02 февраля 2010

Думайте о ПК и Индексе как о просто способе заставить ваши записи в отсортированном порядке. Базы данных могут осуществлять поиск в отсортированных данных намного быстрее, чем в несортированных данных (журнал n против линейного времени).

Составной первичный ключ сортирует в порядке заданных столбцов, поэтому PK (ticket_id, entity_id) сортирует ticket_id ASC, entity_id ASC. Поскольку ваш ПК уже сортирует ticket_ids, он покрывает индекс на ticket_id.

Однако сортировка по entity_id ASC без других столбцов приводит к другому порядку сортировки. Если вам нужно часто запрашивать entity_id, MySQL будет выполнять сканирование индекса (поиск по каждому ticket_id, а затем двоичный поиск результатов для соответствующего entity_id). Ваш отдельный индекс на entity_id сделает запросы для entity_id намного быстрее.

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