DB의 인덱스에 대해서 알아보자
1. 인덱스란
인덱스는 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조로 백과사전의 색인과 같다.
저장되는 컬럼의 값을 사용하여 항상 정렬된 상태를 유지하는 것이 특징.
이러한 특징으로 인해 인덱스는 INSERT, UPDATE, DELETE의 성능이 희생된다는 것이 단점.
2. 인덱스의 자료 구조
MySQL InnoDB를 기준으로 설명드리자면, B+Tree와 같은 변형 B-Tree 자료구조를 이용해서 인덱스를 구현한다.
기본 토대는 B-Tree 인덱스이기 때문에 이를 기준으로 설명한다.
B-Tree 인덱스는 컬럼의 값을 변형하지 않고 인덱스 구조체 내에서 항상 정렬된 상태로 유지한다.
B-Tree(Balanced-Tree)에서는 크게 3가지 노드가 존재한다.
최상위에 하나의 루트 노드가 존재하며, 가장 하위 노드인 리프 노드가 존재한다.
이 두 노드의 중간에 존재하는 브랜치 노드가 존재한다.
최하위 노드인 리프 노드에는 실제 데이터 레코드를 찾아가기 위한 주소값을 가지고 있다.
InnoDB 스토리지 엔진에서는 세컨더리 인덱스(프라이머리 인덱스를 제외한 모든 인덱스)의 리프 노드에는 레코드의 PK가 저장된다.
따라서 세컨더리 인덱스 검색에서는 레코드를 읽기 위해 PK를 가지고 있는 B-Tree를 다시 한번 검색해야한다.
3. 광고
4. MySQL 스캔 방식
MySQL에는 크게 인덱스 레인지 스캔, 인덱스 풀 스캔, 루스 인덱스 스캔 방식이 있다.
인덱스 레인지 스캔은 검색할 인덱스 범위가 결정되었을 경우 사용하며 가장 빠르다.
- 인덱스에서 조건을 만족하는 값이 저장된 시작 리프 노드를 찾습니다.(index seek)
- 시작 리프 노드부터 필요한 만큼 인덱스를 차례대로 읽습니다. (index scan)
- 인덱스 키와 레코드 주소를 이용해 저장된 페이지를 가져오고 레코드를 읽어옵니다.
레코드를 읽어오는 과정에서 랜덤 IO가 발생할 수 있다.
읽어야할 데이터 레코드가 전체 20-25%의 경우에는 풀 테이블 스캔(순차 IO를 이용)이 더욱 좋을 수 있다.
인덱스 풀 스캔은 인덱스를 사용하지만 인덱스를 처음부터 끝까지 모두 읽는 방식이다.
- 인덱스를 ABC 순서로 만들었는데 조건절에 B 혹은 C로 검색하는 경우 사용됩니다.
- 인덱스를 생성하는 목적은 아니지만, 그래도 풀 테이블 스캔보다는 낫습니다. (데이터 레코드까지 읽지 않는 경우)
루스 인덱스 스캔은 듬성듬성하게 인덱스를 읽는 것을 의미한다. (앞서 언급한 인덱스 레인지, 인덱스 풀 스캔은 타이트 인덱스 스캔으로 분류됨.)
- 중간에 필요하지 않은 인덱스 키 값은 무시하고 다음으로 넘어가는 형태로 처리합니다.
- group by, max(), min() 함수에 대해 최적화하는 경우에 사용됩니다.
- 참고
https://www.youtube.com/watch?feature=shared&v=NkZ6r6z2pBg
https://mangkyu.tistory.com/286
'개발 > ETC' 카테고리의 다른 글
로그와 메트릭 알아보기 (77) | 2024.12.14 |
---|---|
트랜잭션 격리수준 알아보기 (120) | 2024.12.09 |
cannot inspect work tree in repository with unmerged files 에러 해결 (104) | 2024.10.25 |
WebRTC를 알아보기 (116) | 2024.06.24 |
readonly option is set (add to override) 오류 해결 (201) | 2024.05.31 |