부리부리부리

DB 인덱스 본문

Computer Science/데이터베이스

DB 인덱스

부리부리부리부리 2024. 1. 17. 17:45

 

Index란?

 

데이터베이스의 인덱스란, 추가적인 저장 공간을 사용해서 테이블 검색 속도를 향상시키기 위한 자료구조이다. 인덱스는 일반적으로 SELECT 쿼리의 WHERE 절에 사용될 컬럼에 대한 조회 성능을 개선할 때 사용된다.

사용 이유?

인덱스를 사용하지 않으면, 데이터를 탐색할 때 풀 테이블 스캔(Full Table Scan)이 발생한다. 사용자가 원하는 데이터를 찾기 위해 테이블에 존재하는 모든 행을 읽어내는 방법이다. 풀 테이블 스캔은 전체 데이터를 탐색하므로, 디스크에서 데이터를 읽어 메모리로 적재하는 IO 비용이 많이 발생하는 가장 느린 테이블 스캔 방식이다.

https://www.youtube.com/watch?time_continue=1755&v=IMDH4iAQ6zM&embeds_referring_euri=https%3A%2F%2Fmysterlee.tistory.com%2F99&source_ve_path=MjM4NTE&feature=emb_title&ab_channel=쉬운코드

 

 

풀 테이블 스캔은 테이블에 인덱스가 존재하지 않거나, 인덱스가 존재한다고 하더라도 데이터베이스의 옵티마이저(Optimizer)가 인덱스 대신 풀 테이블 스캔으로 탐색하는 것이 더 적절하다고 판단할 때 수행된다. 예시로는 table에 데이터가 조금 있을 때 혹은 조회하려는 데이터가 테이블의 상당 부분을 차지할 때 풀 테이블 스캔으로 탐색하는 것이 더 적절한 상황이다.

언제 인덱스 사용할 지?

  1. 데이터가 충분히 많을 때
  2. nullable하지 않은 컬럼
    • null 값이 많은 컬럼은 index를 만들 필요가 없다 (B-Tree 생각해보면됨)
  3. where 조건절, join 시 자주 사용되는 컬럼
  4. 카디널리티가 높은 컬럼
    • 중복 데이터가 적은 컬럼을 의미한다.
  5. 선택도가 낮은 컬럼
    • 조회 결과가 원본 데이터의 약 5% 미만

https://www.youtube.com/watch?time_continue=1755&v=IMDH4iAQ6zM&embeds_referring_euri=https%3A%2F%2Fmysterlee.tistory.com%2F99&source_ve_path=MjM4NTE&feature=emb_title&ab_channel=쉬운코드

 

※ Covering Index - 조회하려는 attribute(s)를 index가 다 cover 할 때 조회 성능이 빠르다.

 

클러스터 인덱스와 논 클러스터 인덱스

 

클러스터형 인덱스(Clustered Index)와 논클러스터형 인덱스(Non-Clustered Index)는 데이터베이스 관리 시스템에서 데이터를 효율적으로 저장하고 검색하기 위해 사용되는 두 가지 주요한 인덱스 유형입니다. 이들은 데이터를 저장하고 접근하는 방식에서 주요 차이를 보입니다.

클러스터 인덱스

클러스터형 인덱스는 테이블 전체가 정렬된 인덱스가 되는 방식의 인덱스 종류이다. 실제 데이터와 무리(cluster)를 지어 인덱싱 되므로 클러스터형 인덱스라고 부른다. 데이터와 함께 전체 테이블이 물리적으로 정렬된다.

데이터가 인덱스의 키 순서대로 저장되기 때문에 범위 검색과 정렬된 데이터의 접근이 빠르다. 인덱스를 통해 데이터에 바로 접근할 수도 있다.

하나의 클러스터형 인덱스만 테이블당 생성할 수 있으며, 이는 다른 키에 대한 최적화를 제한할 수 있다는 단점이 존재하기도 한다. 또한 데이터가 키 순서대로 저장되어야 하므로, 즉 정렬된 상태여야 하므로 INSERT, UPDATE, DELETE 작업 시 물리적 재정렬이 필요하다.

논 클러스터 인덱스

 

논 클러스터 인덱스는 보조 인덱스(Secondary Index)라고도 불리며, 클러스터형 인덱스와 다르게 물리적으로 테이블을 정렬하지 않는다. 그 대신 정렬된 별도의 인덱스 페이지를 생성하고 관리한다. 즉, 실제 데이터를 함께 가지고 있지 않다. 논 클러스터 인덱스는 책 뒷장의 '찾아보기' 페이지와 닮아있다.

논 클러스터 인덱스는 테이블 당 여러개 생성이 가능하다.

장단점

비교

 

B+ Tree?

https://velog.velcdn.com/images/chosj1526/post/ae7d5d21-141b-498d-a274-b5ceb47278e0/image.png

  • leaf node끼리는 Linked list로 연결되어 있다.
  • B+Tree는 오직 leaf node에만 데이터 저장하고, 나머지 노드에는 자식 포인터만 저장한다.
  • DB인덱스 위해, 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조이다. 기존의 B-Tree는 어느 한 데이터의 검색은 효율적(B-Tree의 모든 노드는 데이터와 데이터에 대한 포인터를 함께 저장한다)이나 모든 데이터를 한 번 순회하는데에는 트리의 모든 노드를 방문해야 하므로 비효율적이다. 이것을 개선한것이 B+Tree이다.

장점

  1. leaf node에만 데이터 저장하므로 메모리 확보 -> 하나의 node에 더 많은 포인터를 가질 수 있기 때문에 트리의 높이가 더 낮아지므로 검색속도 높일 수 있다.
  2. Full Scan의 경우 leaf node에만 데이터 저장되어있고, 이들이 Linked List로 연결되어있어 선형 시간이 소모됨.

단점

반드시 특정 key에 접근하기 위해서 leaf node까지 가야한다. (B-Tree는 최상의 경우 특정 key를 root node에서 찾을 수 있다)

인덱스에서는 왜 B-Tree가 아닌, B+Tree를 주로 이용할까?

인덱스 컬럼은 부등호를 이용한 순차 검색 연산이 자주 발생한다 ⇒ B+Tree의 Linked List를 이용하면 효율적인 순차 검색이 가능.

참고

https://hudi.blog/db-clustered-and-non-clustered-index/

 

데이터베이스 인덱스 (2) - 클러스터형 인덱스와 비클러스터형 인덱스

이번 포스팅은 MySQL(InnoDB) 기준으로 작성되었다. 인덱스가 없을 경우 인덱스가 없는 테이블의 페이지 구성 위와 같이 1위부터 10위까지의 인기있는 프로그래밍 언어가 들어있는 테이블이 있다고

hudi.blog

https://mysterlee.tistory.com/99

 

[DATABASE] 인덱스란?

Real MySQL 8.0 책과 유튜브 [쉬운 코드]님의 데이터베이스 강의를 참고하여 작성하였습니다. 1. 인덱스란 데이터베이스의 테이블에 대한 검색 속도를 향상시켜주는 자료구조이다. 데이터베이스에

mysterlee.tistory.com

https://velog.io/@chosj1526/DB-Index-개념-장단점-자료구조

 

[DB] Index - 개념, 장단점, 자료구조(B-Tree, B+Tree)

DB의 테이블에 대한 검색 속도를 향상시켜주는 자료구조테이블의 특정 컬럼에 인덱스 생성 : 해당 컬럼의 데이터를 정렬한 후, 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다. 컬

velog.io