본문 바로가기

DB/이론

인덱스(Index) Re

인덱스는 데이터를 빠르게 찾을 수 있는 하나의 장치이다.

 

러프하게 보면 인덱스는 이진 트리 검색이다. 우선 인덱스를 보기 전에 이진 트리(Binary Tree)를 보자. 

 

이진 트리(Binary Tree)

 

인덱스가 없다면 DB 풀스캔이 일어난다.  최악의 경우 21번을 찾으면 1부터 21까지 찾아야 하는 것이다.

그러나 이진트리를 보자 그러면 10(루트 노트)부터 시작해서 21을 찾아가므로 2번만 찾아가면 된다.

그러므로 상당히 효율적이다. 인덱스도 이와 같다. 그러나 더 효율적인 방법이 B 트리이다.

 

1) B-Tree

 

B-Tree

 

B-Tree를 보면 이진 트리검색보다 범위가 넓으므로 한 단계에서 더 많은 것을 선택할 수 있다. 그러므로

기존 이진 트리검색보다 훨씬 효율적이게 되는 것이다.

 

2) B+Tree

B-Tree보다 효율적인 것이 B+Tree이다. 그림을 보면서 설명하겠다.

B+Tree

 

그림을 보게 되면 맨 하단(리프 노드)에 화살표가 생겼다. 저기서 좋은 점이 뭐냐면 range(범위) 검색할 때 유리하다.

기존 B-Tree같은 경우에는 실제 데이터가 저장되어 있는 리프 노드를 가기 위해 루트 노드에서 다시 시작해야했다.

 

그러나 리프 노드에 데이터끼리 연결되면서 루트 노드에 갈 필요없이 range검색이 더욱 효율적이게 된다.

 

※ 그렇다면 Index 설정은 무조건 효율적인가?

이것에 대한 대답은 아니다. 인덱스 자체도 새로운 데이터의 집합이고 정렬을 하게 된다. 그러므로 삽입, 삭제같은

경우가 일어나면 데이터가 늘어나고 정렬에 대한 처리도 일어나게 된다. 그러므로 삽입, 삭제가 빈번한 경우에는

인덱스를 신중하게 고려해야 한다.

 

→ 고려의 대상의 순서는 다음과 같다.

● [ == ] : Full Scan보다 당연히 Index의 경우가 효율적이다.

● 정렬 : 정렬을 통해서 인덱스의 정렬을 효율적으로 사용할 수 있다.

● [ >, < ] : range(범위)를 통해 하는 쿼리에 쓰는 필드라면 나중에 설정한다.

 

'DB > 이론' 카테고리의 다른 글

SQL Injection - MyBatis  (0) 2024.06.24
Oracle - INDEX  (0) 2024.06.22
VARCHAR, CHAR  (0) 2024.06.21
[ Full Table Scan ] vs [ Index Scan ]  (0) 2024.06.18
DDL, DML, DCL  (0) 2024.06.18