728x90
반응형
- 인덱스는 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조로 백과사전의 색인과 같다.
- 저장되는 컬럼의 값을 사용하여 항상 정렬된 상태를 유지하는 것이 특징이다.
- 이러한 특징으로 인해 인덱스는 INSERT, UPDATE, DELETE의 성능이 희생된다는 것이 단점을 가지고 있다.
인덱스 자료 구조 (MySQL InnoDB 기준)
- B+Tree와 같은 변형 B-Tree 자료구조를 이용해서 인덱스를 구현한다.
- 기본 토대는 B-Tree 인덱스이기 때문에, 컬럼의 값을 변형하지 않고 인덱스 구조체 내에서 항상 정렬된 상태로 유지합니다.
B-Tree(Balanced-Tree)
- B-Tree(Balanced-Tree)에서는 크게 3가지 노드가 존재한다.
- 최상위에 하나의 루트 노드
- 가장 하위 노드인 리프 노드
- 실제 데이터 레코드를 찾아가기 위한 주소값을 가지고 있습니다.
- 이 두 노드의 중간에 존재하는 브랜치 노드
InnoDB 스토리지 엔진에서는 세컨더리 인덱스(프라이머리 인덱스를 제외한 모든 인덱스)의 리프 노드에는 레코드의 PK가 저장된다. 따라서 세컨더리 인덱스 검색에서는 레코드를 읽기 위해 PK를 가지고 있는 B-Tree를 다시 한번 검색해야한다.
MySQL 스캔 방식
- 인덱스 레인지 스캔
- 인덱스 풀 스캔
- 루스 인덱스 스캔
인덱스 레인지 스캔
인덱스 레인지 스캔(Index range scan) 은 검색할 인덱스 범위가 결정되었을 경우 사용하며 가장 빠르다.
- 인덱스에서 조건을 만족하는 값이 저장된 시작 리프 노드를 찾습니다.(index seek)
- 시작 리프 노드부터 필요한 만큼 인덱스를 차례대로 읽습니다. (index scan)
- 인덱스 키와 레코드 주소를 이용해 저장된 페이지를 가져오고 레코드를 읽어옵니다.
레코드를 읽어오는 과정에서 랜덤 IO가 발생할 수 있다. 읽어야할 데이터 레코드가 전체 20-25% 의 경우에는 풀 테이블 스캔(순차 IO를 이용) 이 더욱 좋을 수 있습니다.
인덱스 풀 스캔
인덱스 풀 스캔 (Index full scan) 은 인덱스를 사용하지만 인덱스를 처음부터 끝까지 모두 읽는 방식이다.
- 인덱스를 ABC 순서로 만들었는데 조건절에 B 혹은 C로 검색하는 경우 사용한다.
- 인덱스를 생성하는 목적은 아니지만, 데이터 레코드까지 읽지 않는 경우 풀 테이블 스캔보다는 낫다.
루스 인덱스 스캔
루스 인덱스 스캔 (loose index scan) 은 듬성듬성하게 인덱스를 읽는 것을 의미한다. (앞서 언급한 인덱스 레인지, 인덱스 풀 스캔은 타이트 인덱스 스캔으로 분류)
- 중간에 필요하지 않은 인덱스 키 값은 무시하고 다음으로 넘어가는 형태로 처리한다.
- group by, max(), min() 함수에 대해 최적화하는 경우에 사용된다.
728x90
반응형
'Back-End > Database' 카테고리의 다른 글
데이터베이스 커넥션 풀 미사용 시 발생 문제 (0) | 2025.03.28 |
---|---|
공유 락과 배타 락 (0) | 2025.03.21 |
재귀적 CTE(Common Table Expression) (0) | 2024.08.01 |
Transaction (0) | 2024.07.23 |
MySQL root 계정 비밀번호 재설정 (0) | 2024.07.09 |
댓글