본문 바로가기

SQL/친절한 sql 튜닝

[2주차] 인덱스 2.1

2.1 인덱스 구조 및 탐색

데이터를 찾는 방법

초등학교에서 홍길동 찾기

1) 1학년 1반~ 6학년 마지막반 찾기 == 테이블 전체 스캔

2) 학생부 명부 조회 == 인덱스 이용

 

당연히 2번이 빠르지

홍길동이 많다면 1번

홍길동이 적다면 2번이 빠르다

 

 

2.1.1 미리보는 인덱스 튜닝

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

인덱스는 큰 테이블에서 소량 데이터를 검색할 때 사용한다

 

 

1) 인덱스 스캔 과정에서 발생하는 비효율을 줄인다.

 

 

2) 테이블 엑세스 횟수를 줄이는 것이다. == 랜덤 액세스 최소화 튜닝

 인덱스 스캔 후, 테이블 레코드를 접근함 : 랜덤I/O를 사용함

시력이 1.0~1.5 50명
이름이 홍길동 5명

시력, 이름으로 정렬한 테이블이 각각 두개라면

이름으로 정렬한 학생명부를 사용하는게 DB에 5번 접근한다.

 

만약에 시력으로 정렬한 테이블에서 홍길동을 찾는건 더 비효율적이다.

 

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

 

데이터베이스의 성능이 느린 이유는 디스크 I/O 때문이다

 

 

 

 

2.1.2 인덱스 구조

예시: 책 뒤에 있는 색인

 

색인 없이 메모리 소트 전체 데이터 뒤짐
색인 이용 범위 스캔 가능 두 페이지

 

인덱스를 이용하면 일부만 읽고 멈출 수 있다. == 범위 스캔이 가능하다

 

B Tree 인덱스 구조

 

레코드 하위 블록에 대한 주소값
첫번째 레코드 Leftmost Child 
자식 노드중 가장 왼쪽 끝

첫번째 레코드가 가리키는 곳 왼쪽: 강덕승 보다 작거나 같은 레코드
오른쪽: 송재훈보다 작거나 같은 레코드 
가 저장 되어 있다.

왼쪽으로 갈 수록 루트에 가까운 값 ----------------------------------------오른쪽일수록 멀어지는 값

2.1.3. 인덱스 수직적 탐색 : 시작 지점 찾기

 

루트블록에서 시작  
인덱스 레코드 하위블록에 대한 주소 값

조건을 만족하는 첫번째 레코드를 찾는 과정이다!!

조건을 만족하는 블록을 찾는게 아니다!

2.1.4. 인덱스 수평적 탐색

찾고자 하는 데이터가 안 나타날 때까지 인텍스 리프 블록을 수평적으로 스캔한다.

인덱스에서 데이터를 찾는 과정이다.

인덱스 리프 블록 서로 앞뒤 블록에 대한 주소 값 가진다(양방향 연결 리스트)
ROW ID 인덱스 스캔 하고서 -> 테이블 액세스 할때 ROW ID가 필요함

 

2.1.5. 결합 인덱스 구조와 탐색

두개 이상의 컬럼을 결합해 인덱스를 만듦

남자, 이재희 찾기

1) LMC 첫번째 레코드 남자, 최씨 
2) LMC 첫번째 레코드가 가리키는 하위 블록으로 내려감 왼쪽 브랜치로 이동
3) 남자, 이재희 보다 큰 레코드 : 남자, 정재우를 만난다  
4) 정재우보다 이전 레코드
남자, 이재룡 레코드가 가리키는 하위 블록으로 내려감 
 
5) 리프 블록 도달 인덱스 키 값으로 정렬됨
6) 남자, 이재희보다 큰 값을 만나면 멈춘다  

 

B Tree 인덱스는 엑셀처럼 평면 구조가 아니다.

'SQL > 친절한 sql 튜닝' 카테고리의 다른 글

[5주차] 소트 머지 조인  (0) 2022.04.17
[4주차] 인덱스 튜닝  (0) 2022.04.10
[3주차] 테이블 액세스 최소화  (0) 2022.04.03
인덱스  (0) 2022.03.28
[1주차]  (0) 2022.03.20