2023. 11. 26. 12:13ㆍ스터디/real MySql 스터디
인덱스란?
테이블의 검색 속도를 향상시키는 자료구조이다.
쉽게 생각해서 책의 색인과 같다
처음부터 완전 탐색하면 힘든데, abc순으로 정렬하면 빠르게 찾을 수 있지 않은가?

ldex를 통해 조회 속도를 올릴 수 있으나, insert, delete,update 속도는 느려진다.
그리고 인덱스를 따로 관리하기 위한 추가 작업이 필요하고, 잘못 사용할 결우 오히려 성능이 악화된다.
인덱스는 그럼 언제 사용하는 것이 좋을까?
- 규모가 큰 테이블
- insert, update, delete가 자주 발생하지 않는 컬럼
- join, where, order by가 자주 사용되는 컬럼
- 데이터 중복도가 낮은 컬럼
그럼 Index는 어떻게 구현하는가? 대표적인 방식이 헤시 테이블과 B+ Tree가 있다.
해시 테이블은 Key-Value로 구성되어 있고, 고유 키 별로 인덱스를 생성해서 가져오는 방식이다.
시간복잡도가 O(1)이다, 즉 메우 빠르다

값이 조금이라도 달라지면 아예 다른 해시값을 생성하는데, 이러한 이유로 부등호연산(<,>) 에는 적합하지 않다.
그리키의 일부만 조회하는 부분에서도 인덱스 혜택을 못받기 때문에 보통 B+Tree가 일반적으로 사용된다
B+Tree
자식 노드가 2개 이상인 B-tree를 개선 시킨 구조이다.
BTree는 모든 노드에 데이터를 저장했다면, B+ Tree는 아래와 같은 특징을 가진다
- 리프 노드만 인덱스와 함께 데이터를 가지고 있음
- 나머지 노드는 인덱스만 가지고 있음
- 리프 노드 간 LinkedList로 연결 -> 순차 검색에 용이해 짐
- 데이터 노드 크기는 인덱스 노드와 달라도 됨.
bTree보다 최적화 되었으나, 데이터 탐색을 위해서는 무조건 리프노드로 가야한다는 단점이 있다.


그럼 언제 인덱스를 사용하지 않을까?(=인덱스 풀 스캔을 진행할까?)
- where절이나 on 절에서 인덱스를 이용할 수 있는 적절한 조건이 없는 경우
- 테이블 레코드 건수가 너무 적어서 인덱스를 통해 읽는 거소다 풀 테이블 스캔을 하는 것이 더 빠른 경우
(일반적으로 테이블이 1개의 페이지 만으로 구성되는 경우)
- 인덱스 레인지 스캔을 쓰더라도, 일치되는 레코드 건수가 너무 많은 경우
참조 :
1. Real Mysql 8.0
2. https://mangkyu.tistory.com/96
[Database] 인덱스(index)란?
1. 인덱스(Index)란? [ 인덱스(index)란? ] 인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 우리가 책에서 원하는 내
mangkyu.tistory.com
https://mangkyu.tistory.com/286
[MySQL] B-Tree로 인덱스(Index)에 대해 쉽고 완벽하게 이해하기
인덱스를 저장하는 방식(또는 알고리즘)에 따라 B-Tree 인덱스, Hash 인덱스, Fractal 인덱스 등으로 나눌 수 있습니다. 일반적으로 B-Tree 구조가 사용되기 때문에 B-Tree 인덱스를 통해 인덱스의 동작
mangkyu.tistory.com
'스터디 > real MySql 스터디' 카테고리의 다른 글
Mysql 아키텍처 (1) | 2023.11.26 |
---|---|
DB Lock (2) | 2023.11.25 |
DB isolation level (격리수준) (1) | 2023.11.25 |