index
인덱스는 DBMS의 저장 성능을 희생하고 검색 성능을 높이기 위해 만들어진 자료 구조입니다. 일부 저장공간을 사용하지만 풀 스캔 방식에 비해 빠르게 데이터를 처리할 수 있기 때문에 유용하게 쓰일 수 있습니다.
연산에 따른 인덱스 작업
INSERT
: 새로운 데이터에 대한 인덱스를 추가함
DELETE
: 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행함
UPDATE
: 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가함
UPDATE와 DELETE가 빈번하게 발생된다면 실제 데이터는 10만건이지만 인덱스는 100만 건이 넘어가게 되어, SQL문 처리 시 비대해진 인덱스에 의해 오히려 성능이 떨어지게 될 수 있다.
MangKyu's Diary:티스토리
index
자료 구조hashtable
Key-Value 형태로 데이터를 저장하는 자료구조입니다. 내부적으로 배열을 사용하여 데이터를 저장하기 때문에 빠른 검색 속도를 제공합니다. 데이터 탐색 시 해시 함수(Hash Function)를 이용해 Key에 해당하는 index 값을 구합니다. index를 이용하여 배열에 저장된 value에 접근하기 때문에 해시 테이블의 평균 시간복잡도는 O(1)입니다.
해시가 등호(=) 연산에만 특화되었기 때문에 부등호 연산(>, <)이 자주 사용되는 데이터베이스 검색을 위해서는 해시 테이블이 적합하지 않습니다.
B-Tree
이진트리와 형태는 비슷하지만 한 노드 당 자식 노드가 2개 이상 가능한 자료구조입니다.
최상위 노드를 루트 노드라고 합니다.
중간에 위치한 노드들을 브랜치 노드라고 합니다.
맨 말단에 위치한 노드를 리프 노드라고 합니다.
하나의 노드에 매달린 자식 노드는 2개 이상 가능합니다.
Key-Value 값들은 Key를 기준으로 항상 오름차순으로 정렬되어 있습니다.
B-Tree는 균형트리라서 이론적으로는 모든 데이터에 대해서 같은 속도로 결과를 얻습니다. 하지만 만약 잦은 UPDATE와 DELETE 등으로 균일성이 깨진다면 데이터를 얻는 속도에 차이가 있을 수 있습니다.
B+Tree
B+tree는 B-tree의 확장개념입니다. B+tree의 경우 브랜치 노드에 key만 담아두고, data는 담지 않는다. 오직 리프 노드에만 key와 data를 저장하고, 리프 노드끼리 Linked list로 연결되어 있다.
B+Tree B-Tree차이점
자세히 알아보기
카디널리티(cardinality)
상대적으로 데이터가 중복되지 않는 정도
모든 컬럼을 왜 인덱스에 넣으면 안되나요?
인덱스는 검색 조회를 위한 용도로 데이터베이스에 할당된 메모리를 소모합니다. 최적의 조건이 아닌 모든 컬럼을 인덱스에 넣게 되면 불필요한 메모리 낭비가 발생합니다.
또한, 인덱스는 키 값에 따라 리프 노드의 위치가 결정되므로 키 값을 마음대로 바꿀 수 없습니다. 그래서 기존 키는 삭제 마크만 해 놓고 새로운 키를 삽입하게 되는데, 한 레코드의 컬럼들이 통째로 바뀌게 되면 마킹하고 새로 넣어야 할 키가 많아지게 됩니다.