Подтвердить что ты не робот

Усилие UNIQUE автоматически создает ИНДЕКС в поле?

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

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;

EDIT: как было предложено Корбином, я запросил для 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
4b9b3361

Ответ 1

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

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

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