백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.
1. Unique Index
유니크 제약
- 테이블에 특정 컬럼의 값이 중복되지 않도록 보장하는 제약
- 유니크 제약이 설정된 컬럼은 같은 값이 두 번 이상 저장되지 않도록 함
- 인덱스와 밀접한 연관이 있음
- MySQL에서는 인덱스 없이 유니크 제약을 설정할 수 없음
- 내부적으로 인덱스를 자동으로 생성하여 중복 값 체크를 수행함
Nullable
- 해당 컬럼에 NULL 값이 허용된다는 의미
- NULL은 특정 값이 없다는 표시이며, 다른 값들과 다르게 취급됨
- 즉 NULL은 값 없음을 의미할 뿐, 다른 값들과는 비교할 수 없음
- NULL이 여러 번 있을 수 있음
- NULL은 특정 값이 아니기 때문에 같은 컬러멩서 두 개 이상의 NULL값이 허용될 수 있음
유니크 인덱스와 일반 세컨더리 인덱스의 비교
인덱스 읽기
- 둘의 성능 차이는 미미함
- 혹자는 세컨더리 인덱스의 읽기 방식이 찾은 ROWID를 가지고 한번더 프라이머리 인덱스에 조회하므로 느리다 함
- 그러나 디스크 읽기가 아닌 메모리에서 읽은 값을 비교하는 작업이므로 성능상 거의 영향이 없음
인덱스 쓰기
- 세컨더리 인덱스가 훨씬 빠름
- 유니크 인덱스는 새로 들어온 값이 테이블에 중복되는 컬럼 값이 있는지 체크해야 함
- 새로운 레코드가 INSERT되거나 UPDATE되는 경우 인덱스 쓰기 작업이 필요함
- 데드락
- 중복 체크 작업과 쓰기 작업 시에 락이 걸리는데 이 때 데드락이 빈번히 발생함
- change buffer
- 세컨더리 인덱스는 변경사항을 임시로 보관하는 버퍼가 존재함
- 유니크 인덱스는 중복 체크를 해야 하므로 버퍼링할 수 없음
주의사항
성능이 좋아질 것으로 무작정 생성해서는 안됨
한 컬럼에 유니크 인덱스와 일반 인덱스를 중복적으로 생성할 필요 없음
- 유니크 인덱스가 일반 인덱스 역할을 함
'Database > Mysql' 카테고리의 다른 글
[Real MySQL] 8-6. 인덱스: 함수 기반 인덱스 (0) | 2024.09.07 |
---|---|
[Real MySQL] 8-8. 인덱스: 클러스터링 인덱스 (0) | 2024.09.07 |
[Real MySQL] 5-2. 트랜잭션과 잠금: 격리 수준 (0) | 2024.08.10 |
[Real MySQL] 15-4. 데이터 타입: JSON (0) | 2023.11.26 |
[Real MySQL] 15-3. 데이터 타입: 날짜와 시간 (0) | 2023.11.26 |