✨ 데이터베이스의 인덱스
인덱스(Index) 란?
데이터베이스에서 인덱스(Index)
란 테이블에 대한 동작의 속도를 높여주는 자료 구조를 말한다. 인덱스는 테이블 내의 1개의 컬럼 혹은 여러개의 컬럼을 이용하여 생성될 수 있다. 고속의 검색 동작 뿐만 아니라 레코드 접근과 관룐 효율적인 순서 매김 동작에 대한 기초를 제공한다.
인덱스를 활용하면, 데이터를 조회하는 SELECT 외에도 UPDATE나 DELETE의 성능이 함께 향상된다. 그러한 이유는 해당 연산을 수행하려면 해당 대상을 조회해야만 작업을 할 수 있기 때문이다. 만약 index를 사용하지 않은 컬럼을 조회해야 하는 상황이라면 전체를 탐색하는 Full Scan을 수행해야 한다. Full Scan은 전체를 비교하여 탐색하기 때문에 처리 속도가 떨어진다.
인덱스(Index)의 장단점
장점
- 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다
- 전반적인 시스템의 부하를 줄일 수 있다
단점
- 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다
- 인덱스를 관리하기 위해 추가 작업이 필요하다
- 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다
- CREATE, DELETE, UPDATE가 빈번한 컬럼에 인덱스를 추가하면 인덱스의 크기가 비대해져 성능이 오히려 저하될 수 있다
- 인덱스는 DELETE, UPDATE된 인덱스에 대해 기존 인덱스를 사용하지 않는다고 처리하기 때문에 실제 데이터에 비해 인덱스의 양은 비대해짐
인덱스(Index)를 사용하면 좋은 경우
- 규모가 작지 않은 테이블
- INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
- JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
- 데이터의 중복도가 낮은 컬럼
인덱스 종류
B+-Tree 인덱스 알고리즘
- 일반적으로 사용되는 인덱스 알고리즘
- 컬럼의 값을 변형하지 않고(값의 앞부분만 잘라서 관리) 원래의 값을 이용해 인덱싱함
- B-Tree (Balanced-Tree)
- 균형트리. 루트로부터 리프까지의 거리가 일정한 트리 구조
- 데이터가 정렬된 상태로 유지되어 있음
- 최상위 루트 노드, 중간 브랜치 노드, 최하위 리프노드로 구성되어 있음
- 한 노드당 자식 노드가 2개 이상 가능함
- B+Tree (Balanced+Tree)
- B-Tree의 확장개념으로 브랜치 노드에 key만 담아두고 data는 담아두지 않음
- 오직 리프노드에만 key와 data를 저장하고, 리프 노드끼리 LinkedList로 연결되어 있음
- 데이터를 담아두지 않기 때문에 메모리를 더 확보하며 트리의 높이는 더 낮아짐
- 리프 노드에 데이터가 모두 있기 때문에 한번의 선형탐색만 하면 되므로 B-Tree에 비해 풀스캔이 빠름
Hash 인덱스 알고리즘
- 컬럼의 값을 해시 값으로 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원함
- 값을 변형해서 인덱싱하기 때문에 특정 문자로 시작하는 값으로 검색을 하거나 값의 일부만으로 검색하고자할 땐 사용할 수 없음
https://ko.wikipedia.org/wiki/%EC%9D%B8%EB%8D%B1%EC%8A%A4_(%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4)
https://mangkyu.tistory.com/96