MySQL Unique Index에 대해서
3 min readDec 10, 2023
본 자료는 학습을 하다가 나온 자료를 정리하였습니다.
MySQL을 유니크 인덱스를 배워보아야요.. (??)
유니크 인덱스란
유니크 인덱스는 말 그대로 유니크한 값으로만 인덱스를 만들어서 사용하는 것을 의미한다. MySQL에서는 인덱스 없이 유니크 제약만 설정할 방법이 없다.
유니크 인덱스는 Null 지정이 가능하기 때문에 특정 값이 아니므로 Null만 유일하게 2개 이상 저장될수 있다.
MyISAM이나 MEMORY 테이블에서는 프라이머리 키는 사실 Null 허용 안되는 유니크 인덱스와 같지만, InnoDB 테이블에서는 프라이머리 키는 클러스터링 키의 역할도 하므로 유니크 인덱스와 근본적으로 다르다.
유니크 인덱스와 일반 세컨더리 인덱스의 비교
유니크 인덱스와 일반 세컨더리 인덱스는 인덱스 구조상 아무런 차이점이 없다. 그러나 유니크한 값을 지니냐 안 지니냐에 따라서 성능 차이에 관련된 차이점이 있을 수 있다.
인덱스 읽기
- 유니크 인덱스가 빠르다고 생각하지만 무조건 그렇지 않다.
- 유니크하지 않은 세컨더리 인덱스에서는 한 번 더 해야하는 작업은 디스크 읽기가 아니라 CPU에서 칼럼값을 비교하는 작업이기 때문에 성능상 거의 영향이 없다.
- 유니크하지 않은 새컨더리 인덱스는 중복된 값이 허용되므로 읽어야 할 레코드가 많아서 느린 것이지, 인덱스 자체의 특성 때문에 느린 것이 아니다.
인덱스 쓰기
- 새로운 레코드가 INSERT 되거나 인덱스 컬럼의 값이 변경되는 경우에 인덱스 쓰기 작업이 필요하다. 그런데 유니크 인덱스 같은 경우는 여기에 중복된 값이 있는지 없는지 체크하는 과정이 한 단계 더 필요하다.
- MySQL에서는 유니크 인덱스에서 중복된 값을 체크할때는 읽기 잠금을 사용하고, 쓰기 할 때는 쓰기 잠금을 사용하는데, 이 과정에서 데드락이 아주 빈번히 발생한다.
- InnoDB 스토리지 엔진에서는 인덱스 키의 저장을 버퍼링하기 위해 체인지 버퍼(Change Buffer)가 사용된다. 그래서 인덱스의 저장이나 변경 작업이 상당히 빨리 처리되지만, 유니크 인덱스는 중복 체크를 반드시 해야해서 버퍼링하지 못한다.
- 유니크 인덱스는 일반 세컨더리 인덱스 보다 변경 작업이 느리다.
유니크 인덱스 사용 시 주의 사항
- 일반 인덱스와 유니크 인덱스를 두 개 붙혀놓지 말자! 똑같은 인덱스이다.
- PK를 유니크 인덱스 사용하지 말 것, 이 또한 위와 비슷하게 중복이다. (클러스터링 되어 있다.)
결론적으로 유일성이 보장되어야 하는 데이터에는 유니크 인덱스를 생성하지만, 꼭 필요하지 않다면 유니크 인덱스보다는 유니크하지 않은 세컨더리 인덱스로 생성하는 방법을 고려하길 바란다.
학습자료
- Real MySQL 1권