[DB-MySQL 인덱스(INDEX) #3] 유니크(UNIQUE) 인덱스의 특징과 용법 MySQL

이번 포스팅에서는 유니크 인덱스에 대해 알아보려한다.
나도 책을 읽기 전까지는 유니크 인덱스에 대하여 매우 잘못알고 있었고, 잘못 사용하고 있었다.
내부적인 동작을 자세히 모르는 유저 입장에서는 정말 놀라운 비밀이 숨어있었다.

자, 그럼 먼저 정의를 살펴보자

유니크(Unique) : 종류중에 유일한, 매우 특별한
유니크인덱스(Unique index) : 컬럼값에 중복값이 존재하지 않도록 하는 인덱스(단, Primary key가 아닌 유니크 인덱스는 NULL 값을 여러개 가질 수 있음)


유니크는 사실 인덱스라기보다 제약조건에 가깝다.
유저가 원하는 것이 해당 컬럼에 유일성만을 보장하는 것이라면 사실 필요한 기능은 유니크성 이지, 인덱스는 아니다
하지만 MySQL에서는 인덱스없이 유니스제약만을 설정할 방법이 없다.

그럼 먼저 유니크 인덱스가 일반 보조인덱스와 어떤점이 다른지 살펴보자.

=========================================================================

<유니크 인덱스의 특징>

= 인덱스 읽기 =

많은 사람들이 유니크 인덱스가 빠르다고 생각하는 경향이 있는데 이것은 사실이 아니다.

유니크 인덱스는 값이 유일하므로 값을 1개만 읽어들이면 되고, Non-유니크 인덱스는 여러개 읽어들여야 하는 것이 사실이지만,

사실상 인덱스가 한번 읽어들여져서 하나하나 값을 비교하는 단계에서는 이미 CPU가 그 처리를 담당하고 있다. 그래서 이는 성능상에 영향이 거의 없다고 볼 수 있다.

유니크하지 않는 보조인덱스는 중복이 허용되어 단지 처음에 LOAD해야할 양이 많아서 느린것이지, 인덱스 속성 자체에 의한 딜레이는 아니라는 것이다.

※ 결론 : 유니크와 유니크가 아닌 인덱스의 읽기 성능은 도토리 키재기만큼이나 차이가 없다.

= 인덱스 쓰기 =

UNIQUE 인덱스가 적용되어있는 컬럼에 새로운 값이 INSERT 될때는 값의 중복을 체크해야하는 한단계 과정이 더 필요하다. 그래서 일반 인덱스보다 느리다.

그런데 여기서 중요한점은 MySQL이 중복 값을 체크할때 읽기잠금을 사용하고, 쓰기를 할때는 쓰기잠금을 사용한다.

그리고 이 과정에서 데드락이 아주 빈번하게 발생한다는 것이다.

InnoDB 아키텍쳐를 사용할 때에는 인덱스 키의 저장을 버퍼링할 수 있으나, Unique 인덱스의 경우 중복체크로 인해 버퍼링이 불가능하다.

※ 결론 : 유니크 인덱스는 중복체크라는 과정으로 인해 일반 인덱스보다 쓰기가 더 느리다.

=========================================================================

이제 어느정도 유니크 인덱스의 정체를 알겠는가.? 

빛좋은 개살구라는 말이 있다. 필자의 경우에는 유니크 인덱스가 딱 그격이었던듯 하다.
뭔가 DB에 컬럼을 사용하는데 커다란 성능향상을 가져올것처럼 보였지만, 실상은 그렇지 않은 듯 하기 때문이다.
위 사실을 염두에 두고 앞으로 유니크 인덱스를 조심해서 사용해야할 듯 싶다.

그럼 이제부터는 유니크 인덱스 사용 시 주의사항을 살펴보자.

=========================================================================

<유니크 인덱스 사용 시 주의사항>

- 유니크한 성질(유일성)이 필요한 데이터 컬럼이라면 유니크 인덱스를 생성하는게 당연하다.

- 하지만 성능이 더 좋아질 것으로 생각하고 불필요하게 유니크 인덱스를 생성하지 말자.

- 어느 컬럼에 유니크 인덱스가 존재하는 경우 해당 컬럼과 비슷한 성질의 다른 컬럼에 보조인덱스를 만들필요는 없다.

=========================================================================

이렇게 유니크 인덱스에 대해 알아보았다. 이제 좀 그 정체를 알겠는가.?

이 글을 읽은 분들이 유니크 인덱스를 좀 더 효과적으로 사용하시는데 도움이 되었기를 바라며...

그럼 포스팅 끝,!

덧글

  • 쿠쿠 2015/04/19 12:07 # 삭제

    질문! 중복체크할때 읽기 잠금, 쓰기잠금이 사용된다고 하셨는데 메타락을 말씀하시는건가요? 혹시 MySQL 버전은 어떤걸 사용하시는건가요?
  • 졸린미어캣 2015/04/23 15:38 #

    MySQL 버전은 현재 5.5.41을 사용하고 있구요~
    데이터 잠금에 대한 것은 아직 제가 자세히 알지못해서 대답해드리기가 좀 힘드네요 ㅎㅎ
    나중에 알게되면 따로 연락을 드립지요 ㄱㅅㅇ 님 ^^
※ 로그인 사용자만 덧글을 남길 수 있습니다.


통계 위젯 (블랙)

12154
571
196097

GoogleAdsenseResponsive

Cluster map