2.1 인덱스 구조 및 탐색
2.1.1
- 인덱스 핵심 요소
- 인덱스 스캔 효율화 튜닝: 인덱스 스캔 과정에서 발생하는 비효율을 줄이는 것
- 랜덤 액세스 최소화 튜닝: 테이블 액세스 횟수를 줄이는 것 >> p72~73 더 중요하다고 강조
- SQL 튜닝은 랜덤 I/O와 전쟁
- DB성능이 느린 이유는 디스크 I/O 때문
- 디스크 I/O 중에서도 랜덤 I/O가 더 중요!!
- 랜덤 I/O를 줄이기 위한 여러 가지 기능
- IOT, 클러스터, 파티션, 테이블 Prefetch, Batch I/O 등등
2.1.2 인덱스 구조
- 인덱스를 사용하면 원하는 데이터만 읽고 멈출 수 있는 범위 스캔이 가능
- DBMS는 일반적으로 B*TREE 인덱스를 사용(p75. 그림 2-3 참고)
- **LMC(Leftmost Child)**는 자식 노드 중 가장 왼쪽 끝에 위치한 블록
- ROWID는 DBA(Data Block Address)+로우번호 로 구성되고, 이 값을 알면 테이블 레코드를 찾아갈 수 있음
2.1.3 인덱스 수직적 탐색
- 수직적 탐색이란, 정렬된 인덱스 레코드 중 인덱스 스캔 시작 지점을 찾는 과정
- 루트 블록에서 시작
2.1.4 인덱스 수평적 탐색
- 수직적 탐색으로 스캔 시작점을 찾았으면, 찾고자 하는 데이터가 더 안나타낼 때까지 인덱스 리프 블록을 수평적으로 스캔
2.1.5 결합인덱스 구조와 탐색
- 어느 컬럼을 인덱스 앞쪽에 두든 블록 I/O 개수가 같으므로 성능도 똑같음
- 결합인덱스 생성 시 컬럼 배치 순서
- 선택도가 낮은 컬럼을 앞쪽에 두고 생성해야 검사(비교 연산) 횟수를 줄일 수 있어 성능에 유리함
- 결합인덱스 생성 시 컬럼 배치 순서 기준 (chatGPT)
- ‘개발자를 위한 인덱스 생성과 SQL 작성 노하우(이병국)’
2.2 인덱스 기본 사용법