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 |