본문 바로가기

CS 백엔드/데이터베이스

[DB] INDEX 인덱스

1. 데이터베이스에 있어서 인덱스란?

데이터베이스의 모든 테이블을 검색해서 원하는 결과를 가져오려면 시간이 오래 걸린다.

그래서 컬럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어서 검색 및 정렬 속도를 향상시키는 목적으로 만든다.

인덱스는 항상 정렬된 상태를 유지하기 때문에 원하는 값을 탐색하는데는 빠르지만 새로운 값을 추가하거나 수정, 삭제하는 경우에는 쿼리문 실행 속도가 느려지는 문제가 있다.

즉, 인덱스는 DB에서 데이터의 저장 성능을 희생하고 그 대신 데이터의 읽기 속도를 높이는 기능이다.

 

인덱스의 장점

  • 테이블의 검색 및 정렬 속도 향상
  • 그룹화 작업의 속도 향상

인덱스의 단점

  • 파일 크기가 늘어난다
  • 데이터의 CUD 성능 감소
  • 인덱스 생성 후 데이터 변형이 계속 이루어지면, 인덱스 트리의 깊이가 깊어지고, 무거워져서 성능이 저하될 수 있다.
  • 비용이 많이 든다.

 

2. 그렇다면 왜! 인덱스를 사용할까?

where

  • where 구문에 해당하는 열을 빨리 찾기 위해서

 

join

  • join 시 다른 데이터의 열을 빨리 추출하기 위해서

 

 

3. B - tree, B + tree 인덱스 구조

MySQL의 DB engine인 InnoDB는 B+tree 로 이뤄져있는데, B-tree의 확장된 개념이다.

 

B - tree

B-tree의 핵심은 데이터가 정렬된 상태로 유지되어 있다는 것이다. 가장 상단의 노드를 '루트 노드(Root Node)', 중간 노드들을 '브랜치 노드(Branch Node)', 가장 아래 노드들을 '리프 노드(Leaf Node)'라고 한다.

branch 노드에 key와 data를 담을 수 있다. 루트 노드부터 탐색이 일어나며 브랜치 노드를 거쳐 리프 노드로 내려오게 되는데, 찾고자 하는 데이터에 가까운 인덱스값을 추적하며 그 데이터가 가진 데이터 포인터를 찾아가며 검색이 들어가기 때문에 적은 탐색 횟수로도 빠르게 데이터를 찾을 수 있게 해줍니다

branch 노드에 key와 data를 담을 수 있다. 루트 노드부터 탐색이 일어나며 브랜치 노드를 거쳐 리프 노드로 내려오게 되는데, 찾고자 하는 데이터에 가까운 인덱스값을 추적하며 그 데이터가 가진 데이터 포인터를 찾아가며 검색이 들어가기 때문에 적은 탐색 횟수로도 빠르게 데이터를 찾을 수 있게 해줍니다

 

B + tree

B+tree는 B-tree의 확장개념으로, 브랜치 노드에 key만 담아두고, data는 담지 않는다. 오직 리프 노드에만 key와 data를 저장하고, 리프 노드끼리 Linked list로 연결되어 있어서 수평적으로 탐색이 가능하다.

'CS 백엔드 > 데이터베이스' 카테고리의 다른 글

[DB] SQL과 NoSQL  (0) 2023.02.03
[DB] 트랜잭션의 격리수준  (0) 2023.02.03
[DB] 트랜잭션  (0) 2023.02.01
[DB] 데이터 베이스 정규화  (0) 2023.01.30
[DB] 데이터 베이스(Database)의 기본  (0) 2023.01.29