8.9 유니크 인덱스
- 유니크는 인덱스라기보다 제약 조건에 가깝다.
- MySQL에서는 인덱스 없이 유니크 제약만 설정할 방법이 없다.
- 프라이머리 키는 NULL이 허용되지 않는 유니크 인덱스와 같지만 InnoDB 테이블의 프라이머리 키는 클러스터링 키의 역할도 하므로 유니크 인덱스와는 근본적으로 다르다.
8.9.1 유니크 인덱스와 일반 세컨더리 인덱스의 비교
유니크 인덱스와 일반 세컨더리 인덱스는 구조상의 차이는 없다.
인덱스 읽기
- 유니크 인덱스와 일반 세컨더리 인덱스의 읽기 성능은 거의 차이가 없다.
- 일반 세컨더리 인덱스에선 유니크 인덱스에 비해 CPU에서 칼럼값을 비교하는 작업을 더 하지만 성능에 거의 영향을 주지 않는다.
- 일반 세컨더리 인덱스는 중복 값이 허용되기에 읽을 레코드가 많아 느린 것인지 인덱스 자체 특성 때문에 느린 것은 아니라는 것이다.
- 레코드 1건을 읽을 때 0.1초 걸렸고 2건을 읽을 때 0.2초 걸렸다고 해서 후자를 느리다고 볼 수 없다.
인덱스 쓰기
- 유니크 인덱스는 키 값을 쓸 때 중복 값을 체크하는 과정이 필요하기에 일반 세컨더리 인덱스에 비해 쓰기 성능은 느리다.
- 유니크 인덱스 중복 값을 체크할 때 읽기 잠금을 사용하고, 쓰기를 할 때는 쓰기 잠금을 사용해서 이 과정에서 데드락이 빈번히 발생한다.
- 유니크 인덱스는 반드시 중복 체크를 해야하기 때문에 체인지 버퍼를 이용하지 못해 일반 세컨더리 인덱스보다 변경 작업이 더 느리다.
8.9.2 유니크 인덱스 사용 시 주의사항
- 유일성이 꼭 보장돼야 하는 칼럼에 대해서는 유니크 인덱스를 생성해야하지만 꼭 필요하지 않다면 유니크하지 않은 세컨더리 인덱스 생성을 고려해 보자.
- 유니크 제약 조건을 설정하면 유니크 인덱스가 생기기 때문에 중복으로 인덱스를 설정하지 않아도 된다.
- 유니크 인덱스도 일반 세컨더리 인덱스와 같은 역할을 동일하게 수행할 수 있다.