[핵심 답변]
index는 where 절에서 자주 조회되고, 수정 빈도가 낮으며, 카디널리티는 높고, 선택도가 낮은 column을 선택해서 설정하는 것이 가장 좋습니다.
기준 | 적합성 |
카디널리티(Cardinality) | 높을수록 적합 (데이터 중복이 적을수록 적합) |
선택도(Selectivity) | 낮을수록 적합 |
조회 활용도 | 높을수록 적합 (where 절에서 많이 사용되면 적합) |
수정 빈도 | 낮을수록 적합 |
[면접
TIP]
index를 어떤 column에 대해서 생성하는 것이 좋을지에대한 판단 근거를 물어보는 면접 질문입니다. DB 질문으로 거의 무조건 나오는 질문입니다. 굉장히 중요하지만 내용은 그렇게 어렵지 않으니 확실히 준비해서 꼬꼬무 질문에도 잘 답변하시길 바랍니다.
index를 사용하면 검색속도를 높이지만 추가 저장공간을 차지하고 데이터 업데이트시 속도가 느려지게 됩니다. 따라서 어떤 column에 index를 생성해야 하는지를 잘 학습하시기 바랍니다. 특히 몇 가지 예를 가져와서 이 경우에는 index 적용하는게 좋을까요? 안좋을까요? 라고 추가 질문을 종종 합니다. 꼬꼬무 질문을 참고해 주세요.
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개 정도 권장)
[꼬꼬무 문답]
Q. index를 쓰면 성능이 좋아지니까 모든 컬럼에 인덱스를 사용하면 성능이 더 좋겠네요?
Q. 우리 회사의 고객 DB에서 성별 column에 index를 걸어주는 게 좋을까요?
Q. true 또는 false 값을 갖는 column에서, true 1%, false 99%의 비율로 구성된 상황에서는 index를 거는 게 좋을까요?