장점
SELECT
성능이 향상된다.단점
WHERE
또는 ORDER BY에 자주 사용되는 컬럼→ 만약 어떤 테이블에 UPDATE와 DELETE가 빈번하게 발생된다면 실제 데이터는 10만건이지만 인덱스는 훨씬 많이 존재하게 되어, SQL문 처리 시 비대해진 인덱스에 의해 오히려 성능이 떨어지게 될 것이다.
카디널리티
가 높을 수록 인덱스 설정에 좋은 컬럼
한 컬럼이 갖고 있는 값의 중복 정도가 낮을 수록
좋다.
예를 들어, 10개 rows를 가지는 ‘학생’ 테이블에 ‘학번’과 ‘이름’ 컬럼이 있다고 가정한다.
‘학번’은 학생마다 부여 받으므로 10개 값 모두 고유하다.
‘이름’은 동명이인이 있을 수 있으니 1~10개 사이의 값을 가진다.
선택도
가 낮을 수록 인덱스 설정에 좋은 컬럼
선택도 = 컬럼의 특정 값의 row 수 / 테이블의 총 row 수 * 100
= 컬럼의 값들의 평균 row 수 / 테이블의 총 row 수 * 100
예를 들어, 10개 rows를 가지는 ‘학생’ 테이블에 ‘학번’, ‘이름’, ‘성별’ 컬럼이 있다고 가정한다.
학번은 고유하고, 이름은 2명씩 같고, 성별은 남녀 5:5 비율이다.
‘학번’의 선택도 = 1/10*100 = 10%
SELECT COUNT(1) FROM '학생' WHERE '학번' = 1;
(모두 고유하므로 특정 값: 1)‘이름’의 선택도 = 2/10*100 = 20%
SELECT COUNT(1) FROM '학생' WHERE '이름' = "김철수";
(2명씩 같으므로 특정 값: 2)‘성별’의 선택도 = 5/10*100 = 50%
- SELECT COUNT(1) FROM '학생' WHERE '성별' = F;
(5명씩 같으므로 특정 값: 5)
즉, 선택도는 특정 필드값을 지정했을 때 선택되는 레코드 수를 테이블 전체 레코드 수로 나눈 것
활용도
가 높을 수록 인덱스 설정에 좋은 컬럼
중복도
가 없을 수록 인덱스 설정에 좋은 컬럼
O(1)
이지만 범위 검색에 좋지 않다.
컬럼의 값을 변형하지 않고 원래의 값을 이용해 인덱싱
노드 하나에 여러 데이터가 저장한다. 각 노드 내 데이터들은 항상 정렬된 상태
이며, 데이터와 데이터 사이의 범위를 이용하여 자식 노드를 가진다.
참조 포인터가 적어 방대한 데이터 양에도 빠른 메모리 접근이 가능하다.
참조 포인터로 메모리에 접근한다는 것은, 실제 메모리 상 순서대로 저장이 되었든 안 되었든 접근하려는 주소를 연산을 통해 직접 알아내어 데이터에 접근한다.
주소를 알아내는데 CPU 내부적으로 많은 연산을 수행하게 될 것이다.
그러나 B-Tree는 배열은 데이터들이 메모리 공간에 차례대로 저장이 되어 있으므로 접근할 주소를 바로 알 수 있다.
비록 B-Tree도 자식 노드를 접근할 땐 참조 포인터로 접근을 하지만, 하나의 노드가 가지는 데이터 개수가 많아질수록 포인터 개수는 확연히 줄어들고, 트리 내에서 다루는 데이터가 많아질수록 이러한 차이는 더욱 커질 것이다.
가장 상단의 노드를 '루트 노드(Root Node)', 중간 노드들을 '브랜치 노드(Branch Node)', 가장 아래 노드들을 '리프 노드(Leaf Node)'라고 한다.
리프 노드
에만 key와 data를 저장
하고, 리프 노드끼리 **Linked list**로 연결
되어 있다.리프 노드에 데이터가 모두 있기 때문에
한 번의 선형탐색만 하면 되기 때문에 B-tree에 비해 빠르다. B-tree의 경우에는 모든 노드를 확인해야 한다.구분 | B-tree | B+tree |
---|---|---|
데이터 저장 | 리프 노드, 브랜치 노드 모두 데이터 저장 가능 | 오직 리프 노드에만 데이터 저장 가능 |
트리의 높이 | 높음 | 낮음(한 노드 당 key를 많이 담을 수 있음) |
풀 스캔 시, 검색 속도 | 모든 노드 탐색 | 리프 노드에서 선형 탐색 |
키 중복 | 없음 | 있음(리프 노드에 모든 데이터가 있기 때문) |
검색 | 자주 access 되는 노드를 루트 노드 가까이 배치할 수 있고, 루트 노드에서 가까울 경우, 브랜치 노드에도 데이터가 존재하기 때문에 빠름 | 리프 노드까지 가야 데이터 존재 |
링크드 리스트 | 없음 | 리프 노드끼리 링크드 리스트로 연결 |
Double Linked List
를 사용참고
https://zorba91.tistory.com/293
https://velog.io/@evelyn82ny/B-Tree-index-feat-difference-from-B-plus-Tree