본문 바로가기

programming

[DB] INDEX

1. Index 란

색인, 빨리 찾기 위한 자료구조, 추가적인 작업공간과 저장공간을 할당한다.

데이터와 데이터의 위치를 저장

 

2. 장점

select

update

delete

성능이 향상된다

인덱스를 사용하지 않는 컬럼을 조건절에 검색시, 해당 테이블을 full scan 한다

시스템 부하를 줄일 수 있다

 

3. 단점

인덱스를 관리하기 위한 추가적인 공간 (약 10%) 이 필요하다

추가 작업이 필요하다

인덱스를 잘못 사용하는 경우 오히려 성능이 저하된다

-> 테이블 rows가 적은 경우는 인덱스를 타고 찾는게 오히려 느려짐

-> update, delete의 경우 데이터를 삭제해도 기존의 인덱스는 삭제하지 않고, '사용하지 않음' 처리를 해주기 때문에, 만약 update, delete가 빈번하게 발생하는 테이블의 경우, 실제데이터는 10만건이지만 인덱스는 100만건이 넘어가서 성능이 저하될 수 있음

 

 

4. 예시

title 컬럼에 인덱스를 걸어둔 상황

 

  • 전체 문자열을 =로 그대로 검색하는 경우 -> 인덱스 탐

  • LIKE 검색하는 경우 -> 인덱스 못탐

 

  • title 컬럼자체를 연산하여 검색하는 경우 -> 인덱스 못탐

5. 인덱스 사용 권장하는 경우

  • 규모가 큰 테이블
  • insert, update, delete 가 자주 발생하지 않는 컬럼
  • join이나 where 또는 order by에 자주 사용되는 컬럼
  • 데이터의 중복도가 낮은 컬럼

 

6. 인덱스 자료구조

1) 해시테이블

(key, value)로 저장

빠른 데이터 검색에 유용

등호(=) 연산에만 특화되어 있다

부등호 연산(<, >) 불가능

2) B+Tree

DB의 인덱스를 위해 자식노드가 2개 이상인 B-Tree를 개선시킨 자료구조

리프 노드(데이터노드)만 인덱스와 함께 데이터를 가지고 있고, 나머지 노드 (인덱스 노드)들은 데이터를 위한 인덱스(Key)만 갖는다

리프노드들은 linkedList로 연결되어 있다

데이터 노드 크기는 인덱스 노드의 크기와 같지 않아도 된다

좀더 정리 필요 

https://12bme.tistory.com/138

 

[Real MySQL] B-Tree 인덱스

인덱스는 데이터베이스 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분입니다. MySQL에서 사용 가능한 인덱스의 종류 및 특성에서 각 특성의 차이는 상당히 중요하며, 물리 수준의 모델링을 할

12bme.tistory.com