-
index 란
- 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조
index 자료구조는?
- 대표적으로 B-Tree
- storage engine에 따라 인덱스 구조가 다르다
- MySQL의 경우에 가장 많이 사용하는 storage engine인 InnoDB, MyISAM 같은 경우에는 B-Tree 로 되어있다
- Memory/Heap, NDB 등은 Hash와 B-Tree로 되어있
B-Tree 구조
- B-Tree는 이진트리에서 발전되어 모든 리프노드들이 같은 레벨을 가질 수 있도록 자동으로 밸런스를 맞추는 트리
- 정렬된 순서를 보장함
- B-Tree 인덱스는 Root Block, Branch Block, Leaf Block으로 나누어진다
검색 동작 방식
- Branch Block의 가장 왼쪽 값이 찾고자 하는 값보다 작거나 같으면 왼쪽 포인터로 이동
- 찾고자 하는 값이 Branch Block의 값 사이에 존재하면 가운데 포인터로 이동
- 오른쪽에 있는 값보다 크면 오른쪽 포인터로 이동
index가 수정, 삭제가 많이 일어나는 테이블에 맞지 않는 이유
- index는 또 다른 기존 테이블 외에 인덱스 테이블을 가지고 있기 때문에 검색 속도가 빨라짐
- DML (insert, update, delete) 이 자주 일어나는 테이블의 경우에는 오히려 성능이 떨어질 수 있음
- 인덱스는 데이터를 삭제하더라도 사용 안함 표시를 해주고 끝이지, 실제로 사라지는 것이 아님
- 데이터를 수정하는 경우에도 내부적으로는 delete 후에 다시 insert 하는 로직을 따르고 있음
- 따라서 DML이 자주 일어나는 테이블에서는 오히려 인덱스 테이블이 우너래 테이블보다 크기가 커지는 경우가 발생하게 됨!!
index가 수정, 삭제 + B-Tree
- B-Tree는 정렬된 순서를 보장한다는 특징이 있음
- 따라서 빈번한 수정, 삭제가 일어나면 비효율적임