1. 인덱스 구조 및 탐색

미리보는 인덱스 튜닝

데이터를 찾는 두가지 방법

  1. 테이블 전체를 스캔한다.
  2. 인덱스를 이용한다.

이중 인덱스는 큰 테이블에서 소량 데이터를 검색할 때 사용한다. 테이블 전체 스캔하는 것에 대해서는 튜닝할 요소가 많지 않지만, 인덱스 튜닝에 대해서는 튜닝 요소가 많고 기법도 많다.

인덱스 튜닝의 두 가지 핵심요소

  1. 인덱스 스캔 효율화 튜닝: 인덱스 스캔 자체를 효율적으로 하는 것이다. 스캔의 범위를 줄인다.
  2. 랜덤 액세스 최소화 튜닝: 랜덤 I/O를 최소화 할 수 있는 인덱스를 구성한다.

SQL 튜닝은 랜덤 I/O와의 전쟁이다.

DBMS의 많은 기능이 느린 랜덤 I/O를 극복하기 위해 개발됐다.

인덱스 구조

인덱스는 책의 색인과 같다. 인덱스가 없다면 원하는 정보를 찾을 때 책을 처음부터 끝까지 전부 뒤져야한다. 하지만 인덱스를 사용하면 원하는 곳부터 읽고 중간에 멈출 수 있다. 이것이 가능한 이유는 인덱스는 정렬되어 관리되기 때문이다.

DBMS는 일반적으로 B-Tree 인덱스를 사용한다. Root 부터 Branch를 거쳐 Leaf 노드에서 값을 찾는다. 루트와 브랜치의 각 레코드는 하위 블록에 대한 주소값을 가지고 있다. A값을 가지고있다면 왼쪽 리프에는 A보다 작은 값이, 오른쪽 리프에는 A보자 큰 값이 있다는 뜻이다.

인덱스 탐색과정은 수직적 탐색과 수평적 탐색으로 나눌 수 있다.

인덱스 수직적 탐색 (인덱스 스캔 시작점을 찾는 과정)

루트 노드부터 조건을 만족하는 첫 번째 인덱스를 찾아가는 과정.

탐색 과정에서 찾고자하는 값보다 크거나 같은 값을 만나면 바로 직전 레코드가 가리키는 하위 블록으로 이동한다. 직전 레코드 값이 가리키는 블럭으로 이동해야 레코드를 빠뜨리지 않는다는 사실을 명심해야한다.