[친절한 SQL 튜닝] 2장 인덱스 기본 - 2.1 인덱스 구조 및 탐색

Jiumn·2024년 4월 20일

2.1 인덱스 구조 및 탐색

2.1.1 미리 보는 인덱스 튜닝

데이터를 찾는 2가지 방법

  1. 테이블 전체를 스캔한다. => 순차 I/O (데이터에 순차적으로 접근한다는 의미)
  2. 인덱스를 이용한다. => 랜덤 I/O (데이터에 임의의 순서로 접근한다는 의미)

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

  1. 인덱스 스캔 효율화 튜닝: 인덱스 스캔 과정에서 발생하는 비효율을 줄이는 것.
  2. 랜덤 액세스 최소화 튜닝: 인덱스 스캔 후 테이블 레코드를 액세스를 최소화하는 것.
    => 데이터베이스 성능이 느린 이유는 디스크 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 개수가 같기 때문.
profile
Back-End Wep Developer. 꾸준함이 능력이다. Node.js, React.js를 주로 다룹니다.

0개의 댓글