인덱스란
- 색인과 같은 것
- 검색속도를 향상시키기 위해 데이터를 정렬시켜놓는 방식
- 방법
- 클러스터링 인덱스
- 실제 데이터를 정렬시키는 방식
- 테이블 당 하나만 존재 가능
- 논 클러스터링 인덱스
- 새로운 저장공간에 추가로 인덱스를 생성하는 방식
- 실제 데이터 테이블은 그대로. 별도의 인덱스 테이블 생성
- unique index : 중복 허용 안함
- default index : 중복 허용
=> 총 정리 + 클러스터링 인덱스 : 책 페이지를 직접 펴는 것. + 논 클러스터링 인덱스 : 앞의 목차를 보고 찾는 것. + 풀 테이블 스캔 : 하나하나 찾는 것
- 자료 구조
- B- tree
- 데이터를 리프노드 뿐 아니라 브랜치 노드에도 저장시키는 방식
- B+ tree
- 데이터를 리프노드에만 저장시키는 방식
- 리프 노드끼리는 linked-list 방식으로 연결되어 있음
- 브랜치 노드에는 데이터를 넣지 않기에 좀 더 높은 cache hit 가능
- 풀 스캔 시 리프노드만 스캔하면 되므로 효율적
- 데이터가 이어져 있기 때문에 범위검색 시 효율적
- Hash Table
- Hash 함수를 거쳐 나온 값을 인덱스 테이블로 생성
- 범위 검색은 불가능. 동등 검색만 가능
- 효율적인 방법
- where 문에 자주 사용되는 컬럼을 적용시키면 성능 향상
- 쓰면 안되는 경우
- 매핑 카디널리티가 낮은 경우 == 값 중복이 많은 경우
- update/delete가 잦은 컬럼일 경우 -> 인덱스 테이블까지 변경시켜줘야 함
- 인덱스 테이블 + 리프 노드까지 두번의 데이터 접근이 필요함
- 데이터 가공 시 인덱스를 타지 않는다.
- ex) date_format(reg_date, '%Y-%m-%d')
- 따라서 이런식으로 인덱스를 적용 시 비효율적
- 함수를 사용하는 것이 비효율 적이기에 between 대신에 >=, <= 와 같은 연산자를 사용