Создает ли УНИКАЛЬНОЕ ограничение автоматически INDEX для поля (полей)? - PullRequest
83 голосов
/ 19 марта 2012

Должен ли я определить отдельный индекс для столбца email (для целей поиска) или индекс добавляется автоматически вместе с ограничением UNIQ_EMAIL_USER? 1005 *

CREATE TABLE IF NOT EXISTS `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `first` varchar(255) NOT NULL,
  `last` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_SLUG` (`slug`),
  UNIQUE KEY `UNIQ_EMAIL_USER` (`email`,`user_id`),
  KEY `IDX_USER` (`user_id`)
) ENGINE=InnoDB;

РЕДАКТИРОВАТЬ : в соответствии с предложением Корбина я запросил EXPLAIN SELECT * FROM customer WHERE email = 'address' в пустой таблице.Это результат, я не знаю, как его интерпретировать:

id select_type type possible_keys key  key_len ref  rows Extra
1  SIMPLE      ALL  NULL          NULL NULL    NULL 1    Using where

При добавлении IXD_EMAIL в таблицу тот же запрос показывает:

id select_type type possible_keys key       key_len ref   rows Extra
1  SIMPLE      ref  IDX_EMAIL     IDX_EMAIL 257     const 1    Using where

1 Ответ

93 голосов
/ 19 марта 2012

Уникальный ключ - это особый случай индекса, действующий как обычный индекс с добавленной проверкой уникальности. Используя SHOW INDEXES FROM customer, вы можете увидеть, что ваши уникальные ключи на самом деле являются индексами типа B-дерева.

Достаточно составного индекса (email, user_id), вам не нужен отдельный индекс только для электронной почты - mysql может использовать самые левые части составного индекса. Могут быть некоторые граничные случаи, когда размер индекса может замедлить ваши запросы, но вам не следует беспокоиться о них, пока вы на самом деле не столкнетесь с ними.

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

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