DBMS

인덱스(INDEX)

asd135 2024. 3. 21. 23:58
728x90

인덱스를 쓰는 이유

인덱스는 데이터 검색 속도를 높이기 위해 사용된다.

아래 테이블의 경우 

이름 나이 전화번호 아이디
kim 19 010-1234-5678 abc
kang 20 010-2345-2222 1234
lee 14 010-2312-2345 qwer

 

나이가 20살인 사람을 찾을 때 컴퓨터는 순차적으로 데이터를 하나씩 찾을 것이다. 데이터가 많이 없는 경우 찾는 속도가 빠르지만 데이터가 많아질수록 찾는 속도가 느려진다.

 

인덱스 사용

데이터베이스가 원본 데이터를 복사해 특정 순서로 정렬을 하여 인덱스를 생성한다(나이: 14, 19, 20) 최소한의 검색으로 데이터를 찾을 수 있다.  

 

인덱스를 구현하는 자료구조

클러스터(Clustered)

테이블의 데이터가 인덱스의 순서에 따라 물리적으로 정렬되어 저장된다. B-트리 구조에서는 리프 노드에 데이터를 저장하거나 포인터를 가리킨다.

 

장점: 데이터를 물리적으로 정렬했기 때문에 데이터 검색 속도가 빠르다.

단점: 데이터를 추가할 때 조건에 맞는 위치에 데이터를 저장해야 하기 때문에 추가 속도가 느리다.

 

논클러스터(Non-Clustered) 

인덱스와 데이터가 독립적으로 존재한다. 인덱스는 데이터의 위치를 가리키는 포인터를 저장한다. 

장점: 데이터 추가, 삭제 시 데이터의 재배치가 필요하지 않아 클러스터 방식에 비해 속도가 빠르다.

단점: 데이터를 찾기 위해서 인덱스를 통해 포인터를 찾고 실제 데이터가 저장된 위치로 접근해야 하기 때문에 클러스터 방식에 비해 검색 속도가 느리다.

 

B-트리구조

구조

노드: B-트리의 노드는 여러 개의 키와 그 키에 해당하는 자식 포인터를 가리킨다. 노드의 키는 정렬된 상태이다.
리프 노드: 자식 노드가 없는 노드이며, 데이터 레코드나 데이터 레코드에 대한 포인터를 저장한다.
내부 노드: 내부 노드는 리프 노드가 아닌 모든 노드로 다른 노드로의 포인터를 포함한다.
루트 노드: 트리의 최상위 노드로, 검색은 루프 노드에서 시작된다.

 

연산

검색: B-트리를 통한 검색은 루트 노드에서 시작하여 찾고자 하는 키 값보다 크거나 같은 첫 번째 키를 찾을 때까지 내려간다. 해당 키가 있는 노드를 찾을 때까지 이 과정을 반복한다.
추가: 적절한 리프 노드를 찾아 키를 추가한다.
삭제: 해당 키가 있는 노드를 찾아 삭제한다.