웹서핑을 하다가 RDBMS의 인덱스라는 키워드가 나와서 간략하게 찾아보았다.
색인, 지표, 지수를 뜻하는 영단어로 DB에서는 이를 통해 검색 범위를 좁혀 테이블의 검색 속도 향상을 시킬 수 있다.
INSERT: 새로운 데이터에 대한 인덱스를 추가함
DELETE: 삭제하는 데이터의 "인덱스를 사용하지 않는다는 작업"을 진행함
UPDATE: DELETE 처리하고, 인덱스를 추가함
조회 속도와 성능이 향상된다.
그로인해 시스템의 부하가 줄어든다.
인덱스 관리를 위한 추가적 공간(10%)가 소모된다.
인덱스를 관리하기 위해 추가 작업이 필요하다.
오용의 경우 성능의 하락이 발생한다.
SELECT의 WHERE, JOIN에서 좋은 성능을 발휘할 수 있다.
(+ 오늘 들었던 강의에서는 select,delete,join 명령을 빠르게한다고한다. 아마도 delete 명령의 속도는 빨라지지만 그 사이드 이펙트로 자주사용하게되면 성능이 떨어지는 것이라고 생각된다.)
그러나 DELETE와 UPDATE 연산은 인덱스를 사용하지 않음 처리를 하므로 실제 데이터는 사용 데이터보다 많아지게되고 이때문에 자주 사용하게된다면 성능이 저하된다고 한다.
또 INSERT는 데이터 블록이 새로운 데이터를 받아들이기에 조금 부족한 경우 새로운 데이터 블록을 생성하기 때문에 그 과정에서 성능이 저하된다고 한다.
규모가 작지 않은 테이블
INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
데이터의 중복도가 낮은 컬럼
B-Tree(Balanced Tree)의 확장형으로 브랜치 노드에 key만 담아두고, data는 담지 않는다. 오직 리프 노드에만 key와 data를 저장하고, 리프 노드끼리 Linked list로 연결되어 있다.
그러므로
1. 레벨이 높은 노드에서는 key값만 있으므로 공간확보를 더 할수 있고 -> 노드당 담을 수 있는 key의 숫자가 많아짐으로서 -> 트리의 높이를 낮출 수 있다.
2. 풀 스캔 시, B+tree는 리프 노드에 데이터가 모두 있기 때문에 한 번의 선형탐색만 하면 되기 때문에 B-tree에 비해 빠르다. B-tree의 경우에는 모든 노드를 확인해야 한다.
결론 : 점, 선의 순서대로 구성하라. 긁어올 데이터를 줄이는 조건의 2가지 이상이라면, 가장 먼저 범위를 확 줄이고, 그 후 다음 조건을 적용하는게 성능의 향상에 도움이 될 것이다.
https://mangkyu.tistory.com/96
http://www.gurubee.net/lecture/2229
https://zorba91.tistory.com/293
https://weejw.tistory.com/131