[ DB ] - 인덱스의 개념
1. 인덱스의 개념
- 책의 뒷부분에 있는 색인과 비슷한 개념
- 작은 데이터에는 없어도 큰 차이가 없지만, 대량의 데이터에는 인덱스가 있어야만 빠른 검색이 가능하다.
2. 인덱스의 장단점
1) 장점
- 검색 속도가 무척 빨라질 수 있다. (반드시 그런것은 아니지만)
- 그 결과 시스템의 부하가 줄어들어 시스템 전체 성능 향상에 도움이 된다.
2) 단점
- 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요해진다. (DB의 10퍼센트 내외의 공간이 추가로 필요)
- 인덱스를 생성하는데 시간이 많이 소요될 수 있다.
- 데이터 변경 작업이 자주 일어날 경우에 인덱스를 재작성해야 할 필요가 있기에 성능에 영향을 끼칠 수 있다.
3. 인덱스의 종류
1) 클러스터형 인덱스
- 영어사전과 비슷한 개념
- 클러스터형 인덱스는 테이블당 1개만 생성가능
- 클러스터형 인덱스는 행데이터를 인덱스로 지정한 열에 맞춰 자동정렬
- 인덱스 자체가 데이터
2) 비클러스터형 인덱스
- 일반 책의 찾아보기와 비슷한 개념
- 테이블당 여러개 생성 가능하다.
- 인덱스자체가 데이터가 아니라 인덱스가 가리키는 것이 데이터
4. 인덱스의 특징
- 제약조건없이 테이블 생성시에 인덱스를 만들 수 없다.
- 인덱스가 자동생성되기 위한 열의 제약조건은 Primary KEY와 Unique뿐
5. 인덱스의 내부동작
B-Tree (Balanced Tree, 균형트리)
- 범용적으로 사용되는 데이터구조
- 인덱스를 표현할 때 많이 사용된다.
- 데이터 검색시 뛰어난 성능을 보인다.
- 데이터 변경시 성능이 나빠진다.
- 구성 : 루트노드 + 중간노드 + 리프노드
6. 인덱스의 구조
1) 클러스터형 인덱스
데이터를 추가하면 데이터 분할이 필요하다. 리프페이지가 하나 늘어나고 루트페이지에 데이터페이지를 하나 더 등록시켜준다.
2) 비클러스터형 인덱스
정렬을 하지 않으므로 빈 공간이 존재하면 빈 공간에 바로 들어갈 수 있다.
비클러스터형 인덱스에 데이터추가에 있어서 클러스터형 인덱스보다 효율적이다.
7. 인덱스를 생성해야 하는 경우와 그렇지 않은 경우
- 인덱스는 열 단위로 생성된다.
- WHERE절에서 사용되는 컬럼을 인덱스로 만든다.
- WHERE절에서 사용되더라도 자주 사용해야 가치가 있다.
- 데이터의 중복도가 높은 열은 인덱스로 만들어도 효용이 없다. (예 : 성별, 타입이 별로 없는 경우, 적은경우)
- 외래키가 사용되는 열에는 인덱스를 되도록 생성해주는 것이 좋다.
- JOIN에 자주 사용되는 열에는 인덱스를 생성해주는 것이 좋다.
- INSERT / UPDATE / DELETE가 얼마나 자주 일어나는지를 고려한다.
- 클러스터형 인덱스는 하나만 생성할 수 있다. (없을 수도 있다.)
- 클러스터형 인덱스가 테이블에 아예 없는 것이 좋은 경우도 있다.
- 사용하지 않는 인덱스는 제거하자