유니크 인덱스란
유니크는 인덱스라기 보다는 제약 조건에 가깝습니다. 테이블이나 인덱스에 같은 값이 2개 이상 저장될 수 없음을 의미하는데, MySQL에서는 인덱스 없이 유니크 제약만을 설정할 수 없습니다. 유니크 인덱스에는 NULL도 저장될 수 있습니다. NULL은 특정 값이 아니므로 2개 이상 저장될 수 있습니다.
유니크 인덱스와 일반 세컨더리 인덱스의 비교
유니크 인덱스와 일반 세컨더리 인덱스는 구조상 동일하고 유니크 제약 조건의 유무만 다릅니다.
인덱스 읽기
두 인덱스의 구조가 동일하기 때문에 동일한 레코드양을 읽는다면 성능차이는 없습니다. 다만 일반 인덱스는 키 값의 중복이 없기 때문에 읽어야할 값이 더 많을 수 있습니다.
레코드 1건을 검색하는 경우 두 인덱스의 실행 계획에 차이가 있습니다. 하지만 이는 인덱스의 성격이 유니크한지 아닌지에 따른 차이일 뿐 큰 차이는 없습니다.
인덱스 쓰기
새로운 레코드가 INSERT되거나 변경되면 인덱스 쓰기 작업이 필요합니다. 유니크 인덱스는 키 값의 중복을 확인하는 과정이 필요하기 때문에 일반 세컨더리 인덱스보다 느립니다. 또한 일반 인덱스는 InnoDB 스토리지 엔진의 버퍼풀에 체인지 버퍼를 통해 인덱스 쓰기를 버퍼링할 수 있지만 유니크 인덱스는 중복 체크때문에 버퍼링이 불가능합니다. 중복 체크시 읽기 잠금을 사용하고, 쓰기시 쓰기 잠금을 사용하는데 이 과정에서 데드락이 자주 발생합니다.
정리
유일성이 꼭 보장돼야 하는 칼럼에 대해서는 유니크 인덱스를 생성하되, 꼭 필요하지 않다면 일반 인덱스 생성을 고려하자.
'Database' 카테고리의 다른 글
[MySQL] 옵티마이저 - 개요 (0) | 2023.06.09 |
---|---|
[MySQL] 외래키 (1) | 2023.06.02 |
[MySQL] 클러스터링 인덱스 (0) | 2023.05.25 |
[MySQL] 함수 기반 인덱스 (0) | 2023.05.20 |
[MySQL] B-Tree 인덱스 -4 (0) | 2023.05.19 |