Database/Mysql

[Real MySQL] 8-9. 인덱스: 유니크 인덱스

noahkim_ 2024. 9. 7. 12:23

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.

 

1. Unique Index

유니크 제약

  • 테이블에 특정 컬럼의 값이 중복되지 않도록 보장하는 제약
    • 유니크 제약이 설정된 컬럼은 같은 값이 두 번 이상 저장되지 않도록 함
  • 인덱스와 밀접한 연관이 있음
    • MySQL에서는 인덱스 없이 유니크 제약을 설정할 수 없음
    • 내부적으로 인덱스를 자동으로 생성하여 중복 값 체크를 수행함

 

Nullable
  • 해당 컬럼에 NULL 값이 허용된다는 의미
    • NULL은 특정 값이 없다는 표시이며, 다른 값들과 다르게 취급됨 
    • 즉 NULL은 값 없음을 의미할 뿐, 다른 값들과는 비교할 수 없음
  • NULL이 여러 번 있을 수 있음
    • NULL은 특정 값이 아니기 때문에 같은 컬러멩서 두 개 이상의 NULL값이 허용될 수 있음

 

유니크 인덱스와 일반 세컨더리 인덱스의 비교

인덱스 읽기
  • 둘의 성능 차이는 미미함
  • 혹자는 세컨더리 인덱스의 읽기 방식이 찾은 ROWID를 가지고 한번더 프라이머리 인덱스에 조회하므로 느리다 함
  • 그러나 디스크 읽기가 아닌 메모리에서 읽은 값을 비교하는 작업이므로 성능상 거의 영향이 없음 

 

인덱스 쓰기
  • 세컨더리 인덱스가 훨씬 빠름
  • 유니크 인덱스는 새로 들어온 값이 테이블에 중복되는 컬럼 값이 있는지 체크해야 함
    • 새로운 레코드가 INSERT되거나 UPDATE되는 경우 인덱스 쓰기 작업이 필요함
  • 데드락
    • 중복 체크 작업과 쓰기 작업 시에 락이 걸리는데 이 때 데드락이 빈번히 발생함
  • change buffer
    • 세컨더리 인덱스는 변경사항을 임시로 보관하는 버퍼가 존재함
    • 유니크 인덱스는 중복 체크를 해야 하므로 버퍼링할 수 없음

 

주의사항

성능이 좋아질 것으로 무작정 생성해서는 안됨
한 컬럼에 유니크 인덱스와 일반 인덱스를 중복적으로 생성할 필요 없음
  • 유니크 인덱스가 일반 인덱스 역할을 함