1. 인덱스란
데이터베이스의 테이블에 대한 검색 속도를 향상시켜주는 자료구조입니다. (검색을 위해) 임의의 규칙대로 부여된, 임의의 대상을 가리키는 무언가라고 할 수 있습니다.
- 인덱스는 데이터베이스의 탐색 성능을 좌우합니다.
- 데이터 저장, 수정, 삭제에 대한 성능을 희생시켜 탐색에 대한 성능을 대폭 상승하는 방식입니다.
- 테이블의 특정 Column에 인덱스를 생성하면, 해당 column의 데이터를 정렬한 후, 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장됩니다.
- column의 값과 물리적 주소를 key-value 쌍으로 저장합니다.
일정 시간 내의 검색 속도를 내기 위해서는 B-Tree를 사용해야 합니다.
Index in Database
- 데이터베이스는 내가 원하는 데이터를 어떻게 찾아오는 걸까?
- 왜 데이터가 많아질수록 점점 느려질까?
- 왜 조인만 수행하면 느릴까?
- 왜 쿼리가 느릴까?
2. 장단점
(1) 장점
- 테이블을 검색하는 속도와 성능이 향상
- 시스템의 전반적인 부하를 줄임
- 핵심은 인덱스에 의해 데이터들이 정렬된 형태를 갖는다는 것
- 기존의 Where문으로 특정 조건의 데이터를 찾기 위해서 테이블의 전체를 조건과 비교해야 하는 "Full Table Scan" 작업이 필요했는데, 인덱스를 이용하면 데이터들이 정렬되어 있기 때문에 조건에 맞는 데이터를 빠르게 찾을 수 있습니다.
(2) 단점
- 인덱스를 관리하기 위한 추가 작업이 필요
- 추가 저장 공간 필요
- 잘못 사용하는 경우 오히려 검색 성능 저하
- 인덱스를 항상 정렬된 상태로 유지해야 하기 때문에 인덱스가 적용된 column에 INSERT, DELETE, UPDATE 작업을 수행하면 다음의 추가 작업이 필요합니다.
- INSERT: 새로운 데이터에 대한 인덱스를 추가
- DELETE: 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 수행
- UPDATE: 기존의 인덱스를 사용하지 않음 처리, 갱신된 데이터에 대한 인덱스 추가
3. 언제 사용할까
- 규모가 큰 테이블
- INSERT, UPDATE, DELETE 작업이 자주 발생하지 않는 column
- WHERE, ORDER BY, JOIN 등이 자주 사용되는 column
- 데이터의 중복도가 낮은 컬럼
4. 자료구조
(1) 해시 테이블
해시 테이블은 key value를 한 쌍으로 데이터를 저장하는 자료구조입니다. 해시 충돌이라는 변수가 존재하지만 평균적으로 O(1)의 매우 빠른 시간만에 원하는 데이터를 탐색할 수 있는 구조입니다.
- 해시 테이블은 실제로 인덱스에서 잘 사용하지 않습니다.
- 해시 테이블은 등호 연산에 최적화 되어 있기 때문입니다.
- 데이터베이스에서는 부등호 연산이 자주 사용됩니다.
- 해시 테이블 내의 모든 데이터들은 정렬되어 있지 않으므로 특정 기준보다 크거나 작은 값을 빠른 시간 내에 찾을 수 없습니다.
(2) B+Tree
- B-Tree는 하나의 데이터에 대한 검색은 효율적이지만, 모든 데이터를 한 번 순회하는 데에는 트리의 모든 노드를 방문해야 하므로 비효율적
- B+Tree는 오직 leaf 노드에만 데이터를 저장
- leaf 노드가 아닌 노드에서는 자식 포인터만 저장
- leaf 노드끼리는 linked list로 연결
- Tree: 탐색에 대한 시간복잡도로 O(logN)
- 최악의 경우 Tree: O(N)
- 최악의 경우를 방지하기 위해서 Balanced Tree를 사용
- 트리의 노드가 한 방향으로 쏠리지 않도록, 노드 삽입 및 삭제 시 특정 규칙에 맞게 재정렬되어 왼쪽과 오른쪽 자식 수의 밸런스를 유지하는 트리
- 항상 양쪽 자식의 밸런스를 유지하므로 무조건 O(logN)의 시간 복잡도를 가짐
- 다만 재정렬 되는 작업으로 인해 노드 삽입 및 삭제 시 일반적인 트리보다 성능이 떨어짐
- 그러므로 밸런스 트리는 삽입/삭제 성능을 희생하고 탐색 성능을 높임
5. 핵심
(1) 핵심
- 일정 시간 내의 검색 속도를 내기 위해서는 B-Tree를 사용해야 합니다.
- INSERT, UPDATE, DELETE 작업이 자주 발생하지 않는 column에 사용하는 것이 좋습니다. 특히 DELETE가 자주 발생하지 않아야 합니다.
- 인덱스에 대한 key 값이 있습니다. 무엇을 기준으로 할지에 대한 것입니다.
- B+Tree 가 B-Tree의 단점을 개선시킨 자료구조는 아닙니다. 왜냐하면, 검색속도나 접근성을 높이는 것은 있으나, 업데이트 시키거나 자료를 하나라도 지우면 분리해집니다.
- File System에서 사용하는 자료구조는 B-Tree입니다.
- 컴퓨터 System S/W에서 Kernel이라고 불리는 애들 중에는, Kernel이라는 말을 쓰는 것은 2가지입니다.
- OS, DB
- 데이터는 파일의 형태로 저장되어 있습니다.

- 인덱스는 결국 "빠른 검색 + 무엇을 모르는가를 판단"이 핵심입니다.
- 선형 검색이 아쉬운 것은 6이 없는데도 사진상의 데이터 6개를 모두 뒤져야한다는 것입니다. 그래야 6이 없다는 것을 알 수 있습니다.
- 이것을 비선형 자료구조로 접근하면 쉽게 해결할 수 있습니다.
(2) 예시
- 이진 트리로 설명하면 다음과 같습니다.
- 중간값이 5 정도 되니까 5를 기준으로 합니다.
- 7을 5의 오른쪽에 둡니다.
- 9를 7의 오른쪽에 둡니다.
- 1을 5의 왼쪽에 둡니다.
- 3을 1의 오른쪽에 둡니다.
- 4를 3의 오른쪽에 둡니다.

- 6을 검색하고 싶으면, 5에서 오른쪽으로 갑니다.
- 7의 왼쪽이 없기 때문에, 2번만에 6이 없다는 것을 알 수 있습니다.
- 비선형구조가 선형구조보다 성능이 압도적으로 좋을 수 밖에 없습니다.
(3) 조건이 붙는다면
- 5보다 작은 애들을 찾아달라는 조건을 걸어봅시다. 추가로 내림차순으로 정렬해달라는 조건이 붙었습니다.
- 인덱스는 RAM 메모리에 있고, Data는 파일이니까 HDD에 있습니다.
- 5의 왼쪽을 선택해서 정렬하면 됩니다.
- 그러면 쉽게 1 - 3 - 4로 정렬을 할 수 있습니다.
- 그러면 이제 선형 리스트를 만들게 됩니다.
- index로부터 선형 리스트를 추출하게 됩니다.
- 선형 리스트도 RAM 메모리에 들어가게 됩니다.
- 조건을 찾는 구문이 SELECT 입니다. FIND가 아닌 이유는 어떤 인덱스에서 조건에 맞는 정보들을 추출, 즉 선택하는 것입니다. 그렇게 해서 쉽게 선형구조로 접근이 가능하게 만들어 줍니다.