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


97

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

1
UNIQUE 제약 조건은 기술적으로 인덱스를 필요로하지 않지만 표준이 인덱스를 어떻게 정의하는지 또는 MySQL (백엔드, btw?)이이를 구현하는지 확실하지 않습니다. MySQL에서 수동으로 찾을 수있는 것은 "고유 인덱스는 인덱스의 모든 값이 구별되어야하는 제약 조건을 생성합니다."입니다.

개별 인덱스와 커버링 (일명 복합-둘 이상의 열) 인덱스를 구현하고 테스트해야합니다. 사용 및 데이터에 따라 다릅니다.
OMG Ponies

3
저는 그것이 실제로 인덱스를 생성한다고 99 % 확신합니다. 고유 한 테이블을 만든 다음 where를 선택하여 설명하십시오.
Corbin 2012 년

@Corbin이 그랬습니다. 결과를 어떻게 해석해야합니까?
gremo

고유 제약 조건을 인덱스로 사용 했습니까? 그런데 상당히 큰 테이블을 사용해야 할 수도 있고 테이블 스캔 만 수행 할 수도 있습니다.
Corbin 2012 년

답변:


115

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

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

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


그래서 EXPLAIN테스트는 빈 테이블 때문에 잘못된 값을 보여줍니까?
gremo

Explain 결과를 어떻게 얻었는지 잘 모르겠습니다. 방금 테이블 정의를 복사했으며 동일한 Explain이 UNIQ_EMAIL_USER를 가능한 키로 표시합니다. 다시 확인해 주시겠습니까?
piotrm

좋아, 트릭을 찾았다. 제약 조건을 사용하여 정의 된 경우 user_id먼저 다음 email은에 표시되지 않습니다 EXPLAIN. 알고 계십니까?
gremo

10
이메일이 (user_id, email) 쌍의 가장 왼쪽 부분이 아니기 때문에 작동하지 않습니다. 가장 오른쪽 부분 만 사용하여 행을 찾기 위해 b- 트리로 이동할 수 없습니다.
piotrm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.