데이터베이스에서 인덱스를 사용하는 이유 및 장단점에 대해 설명해주세요.
인덱스가 뭐게요
- 조회 성능 개선을 위한 데이터베이스 테이블의 열에 대한 별도의 자료구조이다.
특징
- 항상 최신의 정렬 상태를 유지한다.
- 인덱스도 하나의 엔티티이다.(컬럼을 복사한다.)
- 엔티티이기 때문에 저장공간이 필요하다.
인덱스의 구조
B-Tree(Balanced-Tree)
- 트리 높이가 같다.
- 자식 노드를 2개 이상 가질 수 있다.
- 데이터베이스의 일반적인 인덱스 구조이다.
- 루트 페이지(루트니까 제일 위)와 브랜치 페이지(리프 페이지와 루트 사이)는 자식 페이지의 정보를 가지고 있다. 페이지: 데이터베이스에 데이터가 저장되는 단위!(MySQL은 16KB)
- 리프 페이지: 실제 데이터 페이지(클러스터링) or 실제 데이터의 주소 페이지(논 클러스터링), 실제 데이터가 저장된 곳을 말한다.
- 리프 페이지는 링크드 리스트 형태로 연결되어 있어, 순차적인 데이터 검색이 가능하다.
- 최악의 경우에도 O(logN)으로 일정한 시간 복잡도를 가진다.
- 문제점: 페이지 분할(페이지에 새로운 데이터를 추가할 여유 공간이 없어 페이지가 나뉘는 것으로, DB 성능이 저하된다.)
- DELETE는 사용 안 함 표시를 한다.
Bitmap 인덱스
- 각 값이 특정 위치에 존재하는지를 비트맵(0 또는 1)으로 기족한 구조이다.
- 중복도가 높은 경우에 사용이 가능하다.(컬럼의 값의 개수가 적은 경우)
- 데이터가 Bit로 구성되어 있기 저장 공간이 작아 효율적이다.
- 복잡한 쿼리에 유리하다.(논리 연산이 가능하기 떄문)
- 데이터 변경에 취약하다.
- 많은 양의 데이터를 처리할 때 유용하다.
종류
클러스터링 인덱스
- 실제 데이터와 같은 무리의 인덱스(aka 기본키)
- 기본키 or Not Null+Unique 제약 조건을 걸어준다.(자동으로 생성된다.)
- 루트와 브랜치는 각각의 자식 페이지의 페이지의 주소 값을 가지고 있어, 이를 데이터 조회에 사용한다.
- 리프 페이지가 데이터 페이지이다.
- 테이블당 1개만 존재한다.
논-클러스터링 인덱스
- 실제 데이터와 다른 무리의 별도의 인덱스(aka unique 제약 조건)
- Unique Index(중복 안됨) or Index(중복)
- 리프 페이지에도 데이터 페이지의 주소가 저장된다.
- 테이블에 여러 개가 존재한다.
- unique 제약 조건 적용시 자동 생성된다.
- 직접 index를 생성하면 논-클러스터링 인덱스이다.
둘을 짬뽕하면?(클러스터링+논-클러스터링)
- 논-클러스터링으로 인덱스가 구성되고, 페이지 주소 값이 들어가지 않고, 실제 데이터 값(클러스터링 인덱스가 적용된)이 저장된다.
어디다 적용해야 할까
- 카디널리티가 높은, 중복도가 낮은 것에 적용하자!(조회하려고 많은 인덱스를 안 거쳐도 되니까)
- Where, Join, OrderBy 절이 자주 사용되는 컬럼
- Insert, Update, Delete가 자주 발생하지 않는 컬럼
- 규모가 작지 않은 테이블(큰 테이블)
주의사항
- 잘 활용되지 않는 인덱스는 제거하자.
- 중복도가 높으면 인덱스 효과가 적다.
- insert, update, delete가 자주 일어나는지를 고려해야 한다.