-
인덱스💻 computer science/📦 database 2022. 10. 5. 18:13
인덱스 🔖
추가적인 쓰기 작업과 저장공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료 구조
ex) 책의 마지막 장에 있는 찾아보기
인덱스를 활용하면, 데이터를 조회하는 SELECT 외에도 UPDATE, DELETE 의 성능이 함께 향상된다.
→ 해당 연산을 수행하기 위해서는 해당 대상을 조회해야만 작업을 할 수 있기 때문이다.
인덱스 관리
DBMS는 index를 항상 최신의 정렬 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다.
- 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE가 수행되면 각각의 연산을 추가적으로 해주어야 한다.
- 그에 따른 오버헤드가 발생
INSERT : 새로운 데이터에 대한 인덱스 추가
UPDATE : 기존의 인덱스를 사용하지 않음 처리 후 갱신된 데이터에 대해 인덱스를 추가
DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행
장점 / 단점
장점 단점 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다. 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 추가로 필요하다. 전반적인 시스템의 부하를 줄일 수 있다. 인덱스를 관리하기 위한 추가 작업이 필요하다. 인덱스를 잘못 사용할 경우 오히려 성능 저하가 될 수 있다. - INSERT, UPDATE, DELETE가 빈번히 일어나는 속성에 인덱스를 설정하면 인덱스의 크기가 매우 커져 성능이 오히려 저하가 된다.
사용하면 좋은 경우 ❓
- 규모가 작은 테이블
- INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
- JOIN, WHERE, ORDER BY에 자주 사용되는 컬럼
- 데이터의 중복도가 낮은 컬럼
- 등등
자료구조
해시 테이블 (Hash Table)
key-value 로 데이터를 저장하는 자료구조
- 빠른 데이터 검색이 필요할 때 유용하다.
Key값을 이용해 고유한 Index를 생성하여 그 Index에 저장된 값을 꺼내오는 구조이다.
하지만, 등호(=)연산에만 특화되어 있어 부등호 연산(< , >)이 자주 사용되는 데이터베이스 검색을 위해서는 해시 테이블은 적합하지 않다.
B+Tree
자식 노드가 2개 이상인 B-Tree 를 개선시킨 자료구조
B-Tree는 모든 노드에 데이터(value)를 저장했던 것과 다른 특성을 가진다.
특징
- 리프노드(데이터 노드)만 인덱스와 함께 데이터를 가지고 있다.
- 다른 노드(인덱스 노드)들은 데이터를 위한 인덱스(key)만을 갖는다.
- 리프노드들은 LinkedList로 연결되어 있다.
- 데이터 노드 크기는 인덱스 노드의 크기와 같지 않아도 된다.
데이터베이스의 인덱스 컬럼은 부등호를 이용한 순차 검색 연산이 자주 발생할 수 있다.
⇒ 리프노드들을 LinkedList로 연결하여 순차검색을 용이하게 하였다.
시간복잡도는 B+Tree가 O(𝑙𝑜𝑔2𝑛)으로 해시테이블보다 느리지만 인덱싱에 더욱 적합한 자료구조이다.
종류
Index 에는 Clustered Index, Non-Clustered Index 두 종류가 존재
Clustered Index
책으로 비유하자면 찾고자하는 페이지를 알고 있어 해당 페이지를 바로 펼치는 것.
이미 정렬된 상태라, 검색시 매우 효율적이다.
⇒ 하지만, 중간에 값을 삽입하거나 정렬을 하는 비용이 커지면 성능에 치명적이다.
- 데이터 삽입, 수정, 삭제시 데이터 전체 정렬 (물리적으로 )
- 삽입되는 순서에 상관없이 index로 생성되어 있는 컬럼을 기준으로 정렬된다.
Index Page를 key - 데이터 페이지 번호 로 구성하고, 검색하고자하는 데이터의 키 값으로 페이지 번호를 검색하여 데이터를 찾는다.
Clustered Index는 테이블 당 한개씩만 존재 가능하다.
⇒ 테이블에서 Index를 걸었을 때 가장 효율적일 것 같은 컬럼을 Clustered Index로 지정한다.
Non-Clustered Index
책으로 비유하자면 목차에서 찾고자하는 내용의 페이지를 찾아 해당 페이지를 펼치는 것
물리적으로 데이터를 정렬하지 않은 상태
- 데이터 페이지가 구성된다.
- 테이들의 데이터는 그대로 두고 지정된 컬럼에 대해 정렬시킨 인덱스를 만든다.
검색(조회) 속도는 Clustered Index보다 느리지만, 데이터의 삽입 / 수정 / 삭제는 더 빠르다.
Non-Clustered Index는 테이블 당 여러개 존재 가능하다.
추가적인 저장공간이 필요하다
- DB 의 10%
참고 자료
'💻 computer science > 📦 database' 카테고리의 다른 글
MySQL - 스토리지 엔진 수준의 락 (0) 2024.05.11 📂 MySQL - 트랜잭션 격리 수준 (0) 2024.05.11 SQL / NoSQL (1) 2022.10.05 트랜잭션 (1) 2022.10.05 정규화 (0) 2022.10.05