Index란?
📌 정의
Index는 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조 이다.
궁극적으로 Insert / Update / Delete의 비용을 Trade off 하면서 가능한 적은 양의 Disk IO를 통해 원하는 데이터를 원활하게 가져올 수 있도록 설정하는 자료구조.
책을 예시로 들면, 책에서 원하는 내용을 찾는다면 책의 모든 페이지를 하나하나 다 둘러본다면 시간이 굉장히 오래걸린다. 하지만, 목차를 이용해 찾는다면 더 빨리진다. 데이터베이스의 Index는 책의 목차와 같다.
👍 장점
조건 검색에서의 효율성
Where절에서 특정 조건에 맞는 데이터를 찾아낼 때 레코드를 처음부터 끝까지 읽게되는데, 이를 풀 테이블 스캔(Full Table Scan)이라고 한다. 인덱스 테이블에서는 데이터가 정렬되어있으므로 Where절에 맞는 데이터를 빠르게 찾아낼 수 있다.
정렬에서의 효율성
Order By는 부하가 많이 걸리는 작업이다.
인덱스는 이미 정렬되어있으므로 Order By절에서 실행되는 Sorting을 피할 수 있다.
MIN, MAX의 효율성
MIN값과 MAX값을 인덱스 테이블의 레코드의 시작값과 끝 값을 한 건씩 가져오면 되기에 Full Table Scan을 할 필요가 없어진다.
👎 단점
정렬된 상태를 계속 유지
인덱스의 가장 큰 문제는 정렬된 상태를 계속 유지해야한다는 점이다. 따라서 레코드 내의 데이터가 바뀌는 작업(INSERT, UPDATE, DELETE)이 발생하면 인덱스 테이블과 원본 테이블 두 군데에서 데이터 수정을 해야한다는 단점이 있다.
⛓ 클러스터형
- 테이블당 하나만 생성가능
- 열 테이터를 인덱스로 지정한 행에 맞춰서 정렬한다
- 리프 페이지에 포인터가 아닌 값이 저장되어있다.
- 각 페이지별로 주소를 가지고있지 않고, 해당 인덱스의 시작 값을 가지고 있다.
- 물리적 페이지 위치가 정렬되어있다.
🔗 비 클러스터형
- 테이블당 여러개 생성가능하다.
- 리프 페이지에 포인터가 저장되어있다.
- 물리적 페이지 위치가 정렬되어있지 않다.
- 단일, 복합, 커버드 등의 인덱스 방식이 있다.
⚠ 주의점
인덱스를 걸어놓은 컬럼을 Where절을 사용해 검색할 때, 가공 또는 연산할 시 인덱스가 제대로 작동하지 않는다.
또, LIKE문에서 ‘%~~’로 검색할 시 인덱스가 작동하지 않는다. 부정연산자와 OR구문 또한 작동하지 않는다.
마지막으로, 일반적인 DBMS에서는 PK에 인덱스가 자동으로 적용된다.