- 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의
검색 속도를 향상시키기 위한 자료구조. - DBMS가 데이터베이스 테이블의 모든 데이터를 검색(full-table scan)해서 원하는 결과를 가져오려면 시간이 오래 걸린다.
- 별도의 메모리 공간에,
칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 정렬되어 저장된다. 항상 정렬된 상태이기 때문에 원하는 값을 탐색하는데는 빠르지만 추가, 삭제, 수정의 경우 실행 속도가 느려진다.- 즉, 인덱스는 데이터의
저장 성능을 희생하고 데이터의읽기 속도를 높이는 기능이다.
- 일반적으로 사용되는 인덱스 알고리즘.
- 칼럼의 값을 변형하지 않고(값의 앞부분만 잘라서) 원래의 값을 이용해 인덱싱한다.
- B-Tree:
- branch node: root/leaf node가 아닌 중간에 있는 node들을 뜻한다.
- 이진 트리와 달리 한 node 당 2개 이상의 child node를 가질 수 있다.
각 node마다 key와 data를 가진다.- 일반적으로
균형 트리(root → leaf 거리 일정)이기 때문에 탐색 시간이 일정하고 빠르다. - full-table scan 시, 노드를 모두 탐색해봐야 한다.
- B+Tree:
- branch node에는 key만 담아두고, data는 담지 않는다.
- 오로지
leaf node에만 key와 data를 저장하고, leaf node끼리 LinkedList로 연결되어 있다. - 하나의 node에 더 많은 key를 담을 수 있어 트리의 높이는 더 낮아진다.
- full-table scan 시, leaf node에 데이터가 모두 있기 때문에 한 번의 선형 탐색만 하면 되어 B-Tree보다 빠르다.
- 칼럼의 값으로 해시 값을 계산해서 인덱싱한다.
동등 연산(=)을 사용하는 검색에는 매우 빠르다.- 값을 변형해서 인덱싱 하므로, 특정 문자로 시작하는 값을 찾거나(LIKE) 값의 일부를 검색(>)할 경우 해시 인덱스를 사용할 수 없다.
- 메모리 기반 데이터베이스에서 많이 사용한다.
- 중복을 포함하지 않는
기본 키로 인덱스를 설정한 경우를 기본 인덱스라고 한다. - 기본 키 기반이므로 테이블 당 한 개만 생성할 수 있다.
Clustered Index: 기본 키 값이 비슷한(물리적으로 인접한 장소에 저장되어 있는) 레코드끼리 묶어서 저장한다.- 기본 키로 인덱스를 설정하면 기본적으로 Clustered Index이다. (변경 가능)
- 기본 인덱스가 아닌 인덱스를 보조 인덱스라고 하며, 필드의 중복이 있을 수 있다.
- 테이블 당 여러 개를 생성할 수 있다.
Non-Clustered Index
- 두 개 이상의 컬럼으로 구성된 인덱스.
- SELECT 질의를 어떻게 할지에 따라 인덱스를 설정해야 한다.
- 예를 들어 title, author 순서로 인덱스를 설정한다면
- title으로 검색하는 경우 효율적이지만
- author만으로 검색하는 경우 효율적이지 않다. (인덱스의 기능을 하지 못함)
- SELECT: 성능을 월등히 향상 시킨다.
- INSERT: 삽입 시 인덱스에도 데이터를 추가해야 하므로 성능이 좋지 않다.
- DELETE: 인덱스에 있는 데이터는 삭제하지 않고, 사용하지 않는다는 표시로 변경한다. 실제 데이터는 10만건인데, 인덱스의 데이터는 100만건 있는 결과를 낳을 수 있고 이 경우 인덱스의 역할을 하지 못하게 된다.
- UPDATE: 이전 데이터를 삭제하고 새 데이터를 삽입하기 때문에, INSERT와 DELETE의 단점이 모두 발생한다.
카디널리티가 높을 수록인덱스 설정에 좋은 칼럼이다. (데이터 집합의 유니크한 값의 개수)선택도가 높을 수록인덱스 설정에 좋은 칼럼이다.- 선택도: 데이터 집합에서 특정 값을 얼마나 잘 골라낼 수 있는지에 대한 지표이다.
- 선택도가 높다는 것은, 한 칼럼이 갖고 있는 값 하나로 적은 row가 찾아지는 것이다.
https://github.com/JaeYeopHan/Interview_Question_for_Beginner
https://zorba91.tistory.com/293
https://velog.io/@timobyjin02/Primary-index-vs.-Secondary-index