2.1 인덱스 구조 및 탐색
2.1.1 미리 보는 인덱스 튜닝
데이터를 찾는 2가지 방법
- 테이블 전체를 스캔한다. => 순차 I/O (데이터에 순차적으로 접근한다는 의미)
- 인덱스를 이용한다. => 랜덤 I/O (데이터에 임의의 순서로 접근한다는 의미)
인덱스 튜닝의 두 가지 핵심 요소
- 인덱스 스캔 효율화 튜닝: 인덱스 스캔 과정에서 발생하는 비효율을 줄이는 것.
- 랜덤 액세스 최소화 튜닝: 인덱스 스캔 후 테이블 레코드를 액세스를 최소화하는 것.
=> 데이터베이스 성능이 느린 이유는 디스크 I/O 때문이므로 2번이 더 중요함.
2.1.2 인덱스 구조
- DBMS는 일반적으로 B*Tree 인덱스를 사용함.
- 루트와 브랜치 블록에 있는 각 레코드는 하위 블록에 대한 주소값을 가짐.
- LMC(Leftmost Child): 자식 노드 중 가장 왼쪽에 위치한 블록. 루트와 브랜치 블록에 있음.
- 인덱스 탐색 과정
- 수직적 탐색: 인덱스 스캔 시작지점을 찾는 과정.
- 수평적 탐색: 데이터를 찾는 과정.
2.1.5 결합 인덱스 구조와 탐색
- 2개 이상의 컬럼을 결합해서 인덱스를 만드는 것.
- 예를 들어 고객 테이블에 성별, 고객명을 기준으로 고객_N1 이라는 인덱스를 만든다면 다음과 같이 순서를 다르게 할 수도 있음.
create index 고객_N1
on 고객(성별, 고객명)
create index 고객_N1
on 고객(고객명, 성별)
- 만약 성별이 '남'이면서 고객명이 '이재희'인 고객을 조회하는 경우, 위와 같이 결합 인덱스의 구성 순서를 다르게 하면 성능이 다를까?
select * from 고객 where 성별 = '남' and 고객명 = '이재희'
- 수직적 탐색을 거쳐 찾은 인덱스 시작점은 '남'인 첫 번째 레코드를 찾는 게 아니라, '남'이면서 '이재희'인 레코드이기 때문에 위의 경우 성능이 같음.
- 인덱스 시작점은 인덱스 선두 컬럼을 모두 "=" 조건으로 검색할 때는 어느 컬럼을 인덱스 앞쪽에 두든 블록 I/O 개수가 같기 때문.