■ 2.1.1 미리보는 인덱스 튜닝
-
데이터를 찾는 두가지 방법
-
인덱스
- 인덱스는 큰 테이블에서 소량 데이터를 검색할 때 사용
- OLTP(Online Transaction Processing) 시스템에서 인덱스 튜닝이 무엇보다 중요하다
-
인덱스 튜닝의 두가지 핵심요소
- 인덱스 스캔 과정에서 발생하는 비효율을 줄이는 것 ⇒ 인덱스 스캔 효율화 튜닝
- 테이블 액세스 횟수를 줄이는 것 ⇒ 랜덤 액세스 최소화 튜닝
추가
- SQL 튜닝은 랜덤 I/O와의 전쟁
- DB 성능이 느린 이유는 디스크 I/O 때문이다.
- 인덱스를 많이 사용하는 OLTP 시스템이라면 디스크 I/O 중에서도 랜덤 I/O가 특히 중요하다.
- IOT, 클러스터, 파티션에서부터 테이블 Prefetch, Batch I/O 처럼 겉으로 잘 드러나지 않는 숨은 기능까지 모두 본질은 랜덤 I/O를 줄이는데 있다.
■ 2.1.2 인덱스 구조
- 인덱스는 대용량 테이블에서 필요한 데이터만 빠르고 효율적으로 액세스 하기 위해 사용하는 오브젝트이다.
- 아래 사진인 색인과 같은 역할을 한다.

- 예시
- 메모리 소트 부분을 학습하려면 처음부터 끝까지 페이지를 다 뒤져야한다.
- 하지만 색인을 이용하면 572page와 576page 두 페이지만 찾으면 된다.
- DBMS는 일반적으로 BTree 인덱스를 사용한다.
- BTree
- 나무(Tree)를 거꾸로 뒤집은 모양이어서 뿌리(root)가 맨 위쪽에 있고, 가지(Branch)를 거쳐 맨 아래에 잎사귀(Leaf)가 있다.

- 루트와 브랜치 블록에 있는 각 레코드는 하위 블록에 대한 주소값을 가진다.
- 키값은 하위에 저장된 키 값의 범위를 나타낸다
- 예시
- 루트 블록 ‘서’ 레코드가 가리키는 하위 블록에는 ‘서’보다 크거나 같은 레코드가 저장돼 있다는 뜻이다.
- 오른쪽 브랜치 블록 ‘이재룡’이 가리키는 하위 블록에는 ‘이재룡’보다 크거나 같은 레코드가 저장돼 있다는 뜻이다.
- 루트와 브랜치 블록에는 키값을 가지 않는 특별한 레코드 LMC가 있다. (왼쪽 첫번째 블록)
- **LMC(Leftmost Child)**가 가리키는 주소로 찾아간 블록에는 키 값을 가진 첫번째 레코드보다 작거나 같은 레코드가 저장돼 있다.