쉽게 말하자면, 책에 있는 목차를 생각하면 된다. 책에 있는 내용을 찾기 위해서, 먼저 목차에서 찾고 목차에 있는 페이지 번호를 보고 찾아가 원하는 내용을 찾듯이 인덱스에서 내가 원하는 데이터를 먼저 찾고 저장되어 있는 물리적 주소로 찾아가는 것이다.
예를 들어, 인덱스 기준이 하나도 잡혀 있지 않아 이름, 성별, 이메일 등이 담긴 회원 테이블이 입력 된 순서대로 존재한다고 가정해보자. 이때 이메일로 회원을 찾으려면 전체 데이터에서 순차적으로 찾는 이메일이 나올 때까지 검색을 하게 된다.
여기서 인덱스를 이메일로 정했다면, 이메일을 기준으로 정렬이 되게 됩니다. 또 다시 이메일로 회원을 찾으려고 한다면, 아까보다 속도가 훨씬 빨라질 것입니다.
즉, 인덱스의 특징으로는
(1) 인덱스는 항상 최신의 정렬 상태를 유지
(2) 인덱스도 하나의 데이터베이스 객체
(3) 데이터베이스 크기의 약 10% 정도의 저장 공간 필요
가 있다.
Full Table Scan 을 사용하는 경우는 (1) 적용 가능한 인덱스가 없는 경우 (2) 인덱스 처리 범위가 넓은 경우(적용 가능한 인덱스가 존재하더라도 처리 범위가 넓어서 Full Table Scan이 더 적은 비용이 든다면 ..) (3) 크기가 작은 테이블에 엑세스 하는 경우 등이 있다.
Binary Search Tree
Binary Search Tree (이진 탐색 트리)의 단점을 극복하기 위해 나온 것 중 하나가 바로 B-Tree다.
먼저, Binary Search Tree를 살펴보면, 이진 트리의 경우 각각의 노드가 최대 두 개의 자식 노드를 가지는 트리 자료구조이다. 균형 있는 이진 탐색 트리의 경우 검색 시간 복잡도가 O(logN) 이지만, 균형 없는 이진 탐색 트리의 경우 시간 복잡도는 O(n) 이다. 즉, ‘운이 나쁘면..’ 전체를 다 탐색해야 할 수도 있다는 소리다.
이러한 단점을 극복하기 위해 나온 것이 B-Tree 다.
B-Tree
아까 Full Table Scan으로 진행했던 것을 B-Tree로 진행을 한다면 아래와 같게 된다.
B-Tree 특징
(1) 모든 노드는 최대 m개의 자식들을 가진다. (2개 이상의 자식 노드를 가질 수 있다.)
(2) 키 값은 오름차순으로 저장
(3) 모든 리프노드들은 같은 높이에 있어야 한다.
B-Tree 의 장점
B-Tree 의 단점
→ 즉, 삽입/삭제를 할 때 처리할 대상을 찾기 위한 조회 성능은 향상 하겠지만 B-tree의 모양을 유지하기 위해 노드의 분할 및 이동이 자주 발생해 성능이 떨어지게 된다.
💡 즉, SELECT 문에 대한 성능은 향상되지만 INSERT UPDATE DELETE 문에서는 성능이 저하된다. 이러한 단점에도 불구하고 일반적인 RDBMS 에서 B-Tree를 쓰는 이유는 일반적인 웹서비스에서 쓰기와 읽기의 비율이 2:8 ~ 1:9 정도 되기 때문이다.예를 들어, id 를 pk 로 가지고, name, email 을 가지는 테이블을 만들어보자. 여기서 email 은 중복이 없게 할 것이다.
CREATE TABLE member (
id int primary key, --> 클러스터 인덱스 자동 생성
name varchar(255),
email varchar(255) unique --> 논-클러스터 인덱스 자동 생성
);
이렇게 하게 되면 pk 로 설정한 id 에 클러스터 인덱스가 자동 생성되고 unique로 설정한 email 에 논-클러스터가 자동 생성된다.
예를 들면, id 를 pk 로 갖는 id, name, email이 담긴 테이블이 있다고 가정을 해보면 id 를 클러스터 인덱스로 가지는 B-tree 가 생성이 된다.
클러스터 인덱스의 특징
email 속성으로 인덱스를 생성한 경우에 대해 알아보자 (여기서 id 는 pk 값이 아니라고 가정)
논-클러스터 인덱스의 특징
cf) RID(Row ID) 란 데이터 위치 포인터를 뜻하는 것으로 해당하는 행의 ‘데이터 페이지 번호-행의 순번(데이터 페이지 오프셋)’ 으로 구성되는 포인팅 정보임
하지만, 우리는 클러스터 인덱스와 논-클리스터 인덱스를 보통 같이 사용한다. 예를 들어 id 는 클러스터 인덱스로, email 은 논-클러스터 인덱스로 사용해서 id 와 email 로 검색하는 경우를 생각해보자
그렇다면 인덱스를 어떤 컬럼에 적용해야 할까?
cf. Cardinality
https://junghn.tistory.com/entry/DB-클러스터-인덱스와-넌클러스터-인덱스-개념-총정리
MySQL 로 배우는 데이터베이스 개론과 실습