Index 인덱스

2023. 11. 26. 12:13스터디/real MySql 스터디

728x90

 

인덱스란?

테이블의 검색 속도를 향상시키는 자료구조이다.

쉽게 생각해서 책의 색인과 같다

처음부터 완전 탐색하면 힘든데, 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

 

728x90

'스터디 > real MySql 스터디' 카테고리의 다른 글

Mysql 아키텍처  (1) 2023.11.26
DB Lock  (2) 2023.11.25
DB isolation level (격리수준)  (1) 2023.11.25