DataBase

[Database] Index란? Index의 방식 및 개념

Jeong Jeon
반응형

음... 알고있던 내용도 다시 정리하는 반성의 시간을 가져야겠다..

최근 충격적이게도 당황하여 설명을 제대로 못한 부분들에 대해 마음이 안좋은상태... 반성하고 차근차근 다시 확인해보자..

 

 

우선 Database의 Index는 가장 흔하게 접할 수 있는 개념이다.

그렇다면 Index는 무엇이고, 내부적으로는 어떻게 이루어져 있는지, 그리고 Index를 어떻게 설계할 수 있는지 생각해보자.

 

Index란?

쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조.

모든 테이블을 조회하게 되면 시간이 오래걸리게되고, 그래서 Index를 활용하게 된다.

Index로 정해진 Column을 기준으로 조회하게 된다면 어떻게 빠르게 조회하게 되는것인가? Index는 어떻게 이루어 져있는지확인해보자.

 

Index를 설계한다면 어떻게 설계할 것인가에 대한 생각을 정리할 수 있는 부분인것같다.

Index는 대표적으로 두가지 방식 (해시 테이블, B+Tree)으로 설계 할 수 있다. 

자세하게 한번 알아보자...

 

1). 해시 테이블(Hash Table)

hashTable은 Key Value 형태로 이루어진 자료구조로, 빠른 조회를 위해 자주 사용된다.

Key값을 이용해 index를 생성하고, 해당 index에 저장된 값을 저장해놓고 사용한다.

hash함수를 이용하여 Key로 들어갈 값 -> 컬럼의 값을 넣어주고,  Value로 들어갈 값 -> 데이터의 위치를 넣어서 사용한다.

시간 복잡도는 O(1)로 굉장히 빠른 검색을 할수 있게 해준다.

하지만 Hash Table로 DB Index를 사용하는 경우 Hash는 등호 (=) 연산에만 특화되어있기 때문에 문제되는 부분이 있게 될것이다.

그렇기 때문에 B+tree 구조로 설계 될수 있고, 해당 방식으로 사용되어져있다. 이부분이 생각나지않았고,,,, 멈춰있는 머리에서 이방식만 떠오르게됬다...

그렇다면 B+ Tree는 어떤 구조인지 확인해 보자.

 

2). B+Tree 

B+Tree는 DB의 인덱스를 위해 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조라고 한다.

Tree구조이기 떄문에 Root Node(기준)/Branch Node(중간)/Leaf Node(말단)으로 구성되며 계층적 구조를 가지고 있다.

 

<B+tree 특징>

  • 리프노드(데이터노드)만 인덱스와 함께 데이터(Value)를 가지고 있고, 나머지 노드(인덱스노드)들은 데이터를 위한 인덱스(Key)를 갖는다.
  • 리프노드들은 LinkedList로 연결되어 있다.

데이터베이스의 인덱스 컬럼은 부등호를 이용한 검색이 자주 발생될 수 있다. 그래서 특정 기간내에 <, >있는 데이터들을 조회하는 경우를 많이 사용하는데, 이부분을 해결하기 위해 LeafNode들을 LinkedList로 구현하고, 순차적으로 (순서를지킨) 검색에 이점을 만들어냈다.

하지만 Root, Branch, Leaf로 나뉘어있고, LinkedList로 연결해놓은 구조이기 때문에 O(log2nlog2n) 의 시간복잡도를 갖는다. 그렇지만 Index로 활용하기에 상기 Hash Table을 사용한 방식의 한계를 극복하기엔 적절하다.

 

하지만 Index를 마구잡이로 사용하면 좋지않다. 오히려 성능과 데이터 메모리에 나쁜영향을 미친다.

그렇다면 Index는 언제 사용하면 좋을까?

확인해보자.

 

인덱스(index)를 사용하면 좋은 경우

  • 규모가 작지 않은 테이블
  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
  • JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
  • 데이터의 중복도가 낮은 컬럼

 

Index를 사용했을때의 장/단점도 한번 확인해보자.

 

장점

  1. 데이터가 정렬되어 있기 때문에 테이블에서 검색과 정렬 속도를 향상시킨다.
    • 조건 검색 Where / Orderby의 효율: Where절의 특정조건을 탐색할때는 정렬되어있는것이 당연히 좋다. 이 때문에 Index의 정렬되어있는 부분이 장점으로 적용된다. 또한 Order by를 사용하지않고 정렬된 상태를 사용할 수 있다.
    • MIN, MAX의 효율적인 처리가 가능: 이것또한 인덱스를 통해 데이터가 정렬되어 있기 때문에 처음부터 끝까지 뒤져서 찾는 것이 아닌 인덱스로 정렬된 데이터에서 MIN, MAX를 효율적으로 추출할 수 있다.
  2. Index를 통해 해당 데이터는 고유한 성질을 부여할 수 있다.
  3. 시스템의 전반적인 부하를 줄일 수 있다.

단점

  1. 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다
  2. 정렬된 상태를 유지하여야 되기떄문에 Insert ,Update, Delete시에 정렬을 다시 해줘야하는 부분이 있다.
  3. 적은 데이터를 처리할때는 굳이 Index Scan보다는 Full Scan이 더 빠르다.

 

아... 공부했던 내용이었지만 정리를 하지않았었고, 그로인해 제대로 머리에 담기지 않았던것 같다.

앞으로 공부를 할때는 정리를 꼭하고,,, 설명을 쉽게 할 수 있을 정도로 해야될것같다.

 

어쩌다보니 개발 지식 정리와 함께 일기까지 쓰는 느낌이되었네

화이팅

반응형