열에 별도의 인덱스 를 정의 해야합니까 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은 복합 인덱스의 맨 왼쪽 부분을 사용할 수 있습니다. 인덱스 크기로 인해 쿼리 속도가 느려질 수있는 경계 케이스가있을 수 있지만 실제로 실행될 때까지 걱정할 필요가 없습니다.
인덱스 사용을 테스트하려면 먼저 옵티마이 저가 해당 인덱스를 사용할 가치가 있다고 생각하도록 테이블에 데이터를 채워야합니다.