본문 바로가기

DB

인덱스와 B-Tree

인덱스란?

  • 색인 : 쉽게 찾아볼 수 있도록 일정한 순서에 따라 놓은 목록
  • 원하는 값을 빠르게 찾을 수 있음
  • where 절을 통해서 검색할 수 있어야 인덱스가 사용됨
  • 데이터베이스 테이블에 대한 검색 성능을 향상시키는 자료 구조이며, where 절 등을 통해서 활용됨

 

인덱스를 적용하지 않는다면?

  • 100만건 이상의 데이터에서 이메일이 yn324@naver.com인 회원을 조회할 때 느리다
  • 전체 데이터에서 순차적으로 확인하기 때문에!
  • 데이터가 기준없이 저장된 상태이기 때문에 데이터가 특정 기준으로 정렬되어 있다면 검색을 빠르게 할 수 있음

 

인덱스 특징

  • 인덱스는 항상 최신의 정렬상태를 유지함
  • 인덱스도 하나의 데이터베이스 객체
  • 데이터베이스 크기의 약 10% 정도의 저장공간 필요

 

인덱스 알고리즘

  • 페이지 : 데이터가 저장되는 단위 (16 kbyte)

인덱스 알고리즘 : Full Table Scan

  • 총 3개의 페이지를 거치고 12번 검색함

특징

  • 순차적으로 접근
  • 접근 비용 감소

사용하는 경우

  • 적용 가능한 인덱스가 없는 경우
  • 인덱스 처리 범위가 넓은 경우
  • 크기가 작은 테이블에 엑세스하는 경우

 

참고 자료구조 : 이진 탐색 트리

  • 모든 노드의 왼쪽 서브트리는 해당 노드의 값보다 작은 값들만 가지고, 모든 노드의 오른쪽 서브 트리는 해당 노드의 값보다 큰 값들만 가짐
  • 20을 기준으로 봤을 때, 20보다 왼쪽 서브트리는 20보다 작고, 20보다 오른쪽 서브트리는 20보다 큼
  • 자녀노드는 최대 2개까지 가질 수 있음

인덱스 알고리즘 : B-tree

  • 자녀 노드의 최대 개수를 늘리기 위해서 부모 노드에 key를 하나 이상 저장함
  • 부모 노드의 key들을 오름차순으로 정렬함
  • 정렬된 순서에 따라 자녀 노드들의 key 값의 범위가 결정됨
  • BST를 일반화한 tree

 

파라미터

  • internal 노드의 key 수가 x개라면 자녀 노드의 수는 언제나 x+1개
  • 모든 leaf 노드들은 같은 레벨에 있음 ⇒ 어떤 경우에도 시간복잡도가 O(logN)임

 

실제 인덱스에서의 B-Tree

 

  • 총 2개의 페이지를 거치고 7번 검색

⇒ 이를 통해 select의 성능이 향상됨

 

 

insert

  • 페이지 분할이 발생하여 성능이 느려지게 됨
  • 페이지 분할
    • 페이지에 새로운 데이터를 추가할 여유공간이 없어 페이지에 변화가 발생
    • DB가 느려지고 성능에 영향을 줌

delete

  • 인덱스의 데이터를 실제로 지우지 않고 사용안함 표시를 함

update

  • 가장 먼저 delete 수행 (기존 값 사용안함 표시)
  • 그 다음 insert 수행 (변경된 값 삽입)

delete & update

  • where절로 처리할 대상을 찾기 위한 조회 성능은 향상되지만,
  • 사용하지 않는 인덱스가 적용되었다면 불필요한 처리량 증가
  • 사용안함 표시로 페이지 낭비 및 인덱스 조각화 심해짐
  • 인덱스 조각화 : 인덱스가 논리적으로 정렬되어 있지 않고, 물리적으로 비효율적으로 저장되어 있는 상태

 

결론

  • select는 성능이 향상되지만 insert, delete, update는 페이지 분할과 사용안함 표시로 인덱스의 조각화가 심해져 성능이 저하

 

인덱스 종류

  • pk를 걸면 자동으로 클러스터링 인덱스가 생김
    • 하나의 컬럼에 not null과 unique 제약조건을 같이 걸어도 걸림
  • unique 제약조건을 걸면 자동으로 논 클러스터링 인덱스가 생김

 

클러스터링 인덱스

  • 실제 데이터와 같은 무리의 인덱스
  • 실제 데이터가 정렬된 사진
  • 실제 데이터 자체가 정렬
  • 테이블당 1개만 존재 가능
  • 리프 페이지가 데이터 페이지
  • 아래 제약조건 시 자동 생성
    • pk를 걸면 (우선순위 1위)
    • not null + unique

 

클러스터링 인덱스 적용

 

논 - 클러스터링 인덱스

  • 실제 데이터와 다른 무리의 별도의 인덱스
  • 실제 데이터 탐색에 도움을 주는 별도의 찾아보기 페이지
  • 실제 데이터 페이지는 그대로
  • 별로의 인덱스 페이지 생성 → 추가 공간 필요
  • 테이블당 여러 개 존재
  • 리프 페이지에 실제 데이터 페이지 주소를 담고 있음
  • 아래 제약조건 시 자동 생성
    • unique 제약조건 적용시 자동 생성
    • 직접 index 생성시 논-클러스터링 인덱스 생성

 

논 - 클러스터링 인덱스 적용

  • 이름에 인덱스 걸음
  • 리프페이지에서 이름을 기준으로 정렬된 모습을 보임

 

 

클러스터링 + 논클러스터링을 동시에 적용했을 때

  • 데이터가 추가되거나 삭제될 때마다 인덱스페이지의 주소가 바뀌면 비효율적이기 때문에
  • 논 클러스터링 인덱스의 리프 페이지에 실제 데이터 페이지 주소가 아닌 클러스터링 인덱스가 적용된 컬럼의 실제 값을 가지고 있음

 

인덱스 적용 기준

  • 카디널리티 : 테이블에서의 행의 갯수, 요소의 갯수
  • 디그리 : 테이블에서의 열의 갯수
  • 카디널리티(그룹 내 요소의 개수)가 높은 것, 중복수치가 낮은 것에 걸어야 함!
  • where, join, order by 절에 자주 사용되는 컬럼
    • 인덱스는 추가 공간이 필요로 됨
    • 조건 절이 없다면 인덱스가 사용되지 않음
  • insert, delete, update 가 자주 발생하지 않는 컬럼
  • 규모가 작지 않은 테이블

 

출처

https://www.youtube.com/watch?v=bqkcoSm_rCs 

https://youtu.be/edpYzFgHbqs?si=LOEZHxbgX_-_myEa

'DB' 카테고리의 다른 글

REST API  (0) 2024.07.18
MySQL (2)  (1) 2024.07.18
MySQL (1)  (0) 2024.07.18
데이터베이스(5)  (0) 2024.05.13
데이터베이스(4)  (1) 2024.05.13