✨ 인덱스?
책의 제일 뒤를 보면 인덱스가 존재한다. 기준에 따라 정렬이 되어있고, 같은 키워드일 경우 페이지 순의 정리가 되어 있다.이와 같이 인덱스를 이용하면 원하는 키워드를 포함한 페이지를 빠르게 찾을 수 있다.
🪡 인덱스 구조
인덱스는 다양한 구조를 제공하는데, 기본적으로 원하는 데이터를 찾기 쉽도록 한다는 것이 동일하다.
그러나, DBMS마다 null 값을 다루는 방식 등의 세부적 차이가 있으므로 반드시 숙지하는 것이 중요하다.
🐣인덱스 탐색
수평적 탐색 - 인덱스 리프 블록에 저장된 레코드끼리 연결 순서에 따라 좌 또는 우, 우 또는 좌에서 스캔한다.
수직적 탐색 - 수평적 탐색을 위한 시작 지점을 찾는 과정으로, 루트에서 리프 블록까지 아래쪽으로 진행한다.
🧶 인덱스 스캔 방식
🐣Index Range Scan
인덱스 루트 블록에서 인덱스 리프 블록까지 수직적으로 탐색한 후에 리프 블록을 필요한 범위 (Range)만 스캔하는 방식. B-Tree 인덱스의 가장 일반적인 형태의 엑세스 방식이다.
🐤Index Full Scan
수직적 탐색 없이 인덱스 리프 블록을 처음부터 끝까지 수평적으로 탐색하는 방법으로써, 주로 데이터 검색을 위한 최적의 인덱스가 존재하지 않을 때 사용한다.
✨Index Unique Scan
수직적 탐색으로만 데이터를 찾는 스캔 방식으로, Unique 인덱스를 '=' 조건으로 사용할 때 작동한다.
💡Index Skip Scan
루트 또는 브랜치 블록에서 읽은 칼럼 값 정보를 이용해 조건에 부합하는 레코드를 포함할 “가능성이 있는” 하위 블록(브랜치 또는 리프 블록)만 골라서 액세스하는 방식이라고 할 수 있다.
조건절에 빠진 인덱스 선두 칼럼의 Distinct Value 개수가 적고 후행 칼럼의 Distinct Value 개수가 많을 때 유용하다.
🌮 Index Fast Full Scan
Index Fast Full Scan은 Index Full Scan보다 빠르다. Index Fast Full Scan이 Index Full Scan보다 빠른 이유는, 인덱스 트리 구조를 무시하고 인덱스 세그먼트 전체를 Multiblock Read 방식으로 스캔하기 때문이다.
🏉 Index Range Scan Descending
Index Range Scan과 기본적으로 동일한 스캔 방식이다. 덱스를 뒤에서부터 앞쪽으로 스캔하기 때문에 내림차순으로 정렬된 결과집합을 얻는다는 점만 다르다.
🏹 인덱스 종류
🐤B*Tree 인덱스
모든 DBMS가 B*Tree 인덱스를 기본적으로 제공하며, 추가적으로 제공하는 인덱스 구조는 모두 B*Tree 인덱스의 단점을 보완하기 위해 개발된 것들이다.
🐣비트맵 인덱스
맵에 해당하는 키의 값을 0 또는 1로 입력하여 찾기 쉽도록 한 형태로, 비트맵 인덱스는 여러 인덱스를 동시에 활용할 수 있다는 장점 때문에 다양한 조건절이 사용되는, 특히 정형화되지 않은 임의 질의(ad-hoc query)가 많은 환경에 적합하다.
💡함수 기반 인덱스
칼럼 값 자체가 아닌, 칼럼에 특정 함수를 적용한 값으로 B*Tree 인덱스를 만든다.
함수기반 인덱스는 데이터 입력, 수정 시 함수를 적용해야 하기 때문에 다소 부하가 있을 수 있으며, 사용된 함수가 사용자 정의 함수일 때는 부하가 더 심하다.
🏉리버스 키 인덱스
말 그대로 입력된 키 값을 거꾸로 변환해서 저장하는 인덱스다. reverse 함수에서 반환된 값을 저장하는 인덱스라고 생각하면 쉽다.
🎁클러스터 인덱스
클러스터 인덱스도 일반적인 B*Tree 인덱스 구조를 사용하지만, 해당 키 값을 저장하는 첫 번째 데이터 블록만 가리킨다는 점에서 다르다. 클러스터 인덱스의 키 값은 항상 Unique하며, 테이블 레코드와 1:M 관계를 갖는다.