[mysql] UNIQUE 제약 조건이 필드에 INDEX를 자동으로 생성합니까?

열에 별도의 인덱스정의 해야합니까 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;

편집 : Corbin이 제안한대로 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



답변

고유 키는 고유성에 대한 추가 검사와 일반 인덱스처럼 행동, 인덱스의 특별한 경우이다. 사용 SHOW INDEXES FROM customer하면 고유 키가 실제로 B- 트리 유형 인덱스임을 알 수 있습니다.

지수(email, user_id)충분하다, 당신은 전용 이메일에 별도의 인덱스가 필요하지 않습니다 – MySQL은 복합 인덱스의 맨 왼쪽 부분을 사용할 수 있습니다. 인덱스 크기로 인해 쿼리 속도가 느려질 수있는 경계 케이스가있을 수 있지만 실제로 실행될 때까지 걱정할 필요가 없습니다.

인덱스 사용을 테스트하려면 먼저 옵티마이 저가 해당 인덱스를 사용할 가치가 있다고 생각하도록 테이블에 데이터를 채워야합니다.


답변