[DB] Index를 어느 Column에 사용하면 좋을까?

최동혁·2023년 1월 12일
0

데이터베이스

목록 보기
9/18

Index 효과적으로 사용하는 방법

  • SELECT WHERE절에 자주 사용되는 Column에 대해 index를 생성하는 것이 좋다.
  • 데이터 수정 빈도가 낮을수록 적합하다. insert / update / delete 작업 시, 데이터에 변화가 생기기 때문에 index에서는 매번 정렬을 다시 해야한다. 이에 따른 부하가 발생하기 때문에 수정 빈도가 낮은 column을 index로 설정하면 좋습니다.
  • 데이터의 중복이 높은 column은 index 효과가 별로 없다. 예를 들어 성별은 종류가 2 가지 밖에 없으므로 index를 생성하지 않는 것이 좋다. 즉, 선택도가 낮을 때 유리하다.(보통 5~10% 이내)
  • 데이터의 양이 많을 수록 index로 인한 성능향상이 더 크다. 데이터 양이 적다면 index의 혜택보단 손해가 더 클 수 있다.
  • Join 조건으로 자주 사용되는 column의 경우
  • 한 table에 index가 너무 많은면 데이터 수정시 소요되는 시간이 너무 길어질 수 있다. (table당 4~5개 정도 권장)

면접 질문

  1. Index를 어느 Column에 사용하면 좋을까요?

    index는 where 절에서 자주 조회되고, 수정 빈도가 낮으며, 카디널리티는 높고, 선택도가 낮은 column을 선택해서 설정하는 것이 가장 좋습니다.

기준적합성
카디널리티(Cardinality)높을수록 적합 (데이터 중복이 적을수록 적합)
선택도(Selectivity)낮을수록 적합
조회 활용도높을수록 적합 (where 절에서 많이 사용되면 적합)
수정 빈도낮을수록 적합

선택도란?

  • 데이터에서 특정 값을 잘 골라낼 수 있는 정도
  • 선택도 = 카디널리티 / 전체 레코드 수
  • 선택도가 1이면 모든 데이터가 unique 함을 의미함.

카디널리티란?

  • 데이터가 중복되지 않는 정도
  • 예를 들어, 주민등록번호는 중복되는 값이 없으므로 카디널리티가 높다.
  • 하지만 성별의 경우, [남자/여자] 값이 중복되어 등장하기 때문에 카디널리티가 낮다.
  1. Index를 쓰면 성능이 좋아지니까 모든 컬럼에 인덱스를 사용하면 성능이 더 좋겠네요?

    그렇지 않습니다. 일단 index는 SELECT WHERE절에 대해서만 성능향상을 해줍니다. 이외에 데이터를 수정하게 되면 모든 index를 업데이트(+정렬)해야 하기 때문에 오히려 성능저하를 초래합니다. 또한 index를 생성할 때마다 저장공간도 차지하기 때문에 무분별하게 생성해서는 안됩니다.

  2. true 또는 false 값을 갖는 column에서, true 1%, false 99%의 비율로 구성된 상황에서는 index를 거는게 좋을까요?

    아무리 1%, 99%로 비율에 차이가 있어도, true / false 두 종류로만 나눠지는 경우에는 카디널리티가 매우 낮게 됩니다. 이 경우, index가 주는 이점이 매우 적고 오히려 저장공간 차지와 데이터 수정시 성능저하등을 고려하여 index를 생성하지 않는 것이 좋습니다.

profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN