-
[CS study] 2022.06.17CS 2022. 6. 17. 18:46
DB index
index
- 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료구조
- 특정 칼럼에 인덱스를 생성 해당 칼럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 저장됨
- 이렇게 저장되면 앞으로의 쿼리문에 인덱스를 이용해 검색 속도의 향상을 가져올 수 있음
- 실제 DB 관련 작업에서 속도 저하는 Select 문 특히 Where문에서 발생하는데 이런 문제의 대안으로 index를 사용
- 가장 큰 특징으로는 데이터들이 정렬되어 있다 조건 검색이라는 영역에서 굉장한 장점
조건 검색 Where 절의 효율성
- 테이블을 만들고 데이터가 쌓이면 레코드는 내부적으로 순서가 없이 저장됨
- 이렇게 되면 Where절에 특정 조건에 맞는 데이터를 찾아낼 때도 레코드의 처음부터 끝까지 다 읽어야 함
- 하지만 인덱스 테이블은 데이터들이 정렬되어 저장되어 있기 때문에 조건에 맞는 데이터를 빠르게 찾아낼 수 있음
정렬 Order by 절의 효율성
- 인덱스를 사용하면 Order by에 의한 Sort 과정을 피할 수가 있음
- Order by는 부하가 많이 걸리는 작업임
- 정렬과 동시에 1차적으로 메모리에서 정렬 메모리보다 큰 작업 일시 디스크 I/O도 추가적으로 발생하기 때문
- 인덱스를 사용하면 전반적인 자원의 소모를 하지 않아도 됨 이미 정렬이 되어있기 때문임
MIN, MAX의 효율적인 처리
- 이것 또한 데이터가 정렬되어 있기에 얻는 장점임
- MIN, MAX를 레코드의 시작 값과 끝 값만 가져오면 됨
인덱스의 단점
- 가장 큰 문제는 정렬된 상태를 계속 유지시켜주어야 함
- 그렇기에 레코드 내에 데이터 값이 바뀌는 부분이면 악영향을 미침
- INSERT, UPDATE, DELETE를 통해 레코드의 값이 바뀌면 인덱스 테이블의 값들을 다시 정렬해야 함
- 인덱스 테이블 원본 테이블 두 군데에 데이터 수정 작업을 해줘야 함
- 인덱스를 관리하기 위해 DB에 10%에 해당하는 저장공간이 필요함
인덱스의 관리
- 데이터 값이 변경되면 계속 정렬을 해주어야 하기 때문에 부하가 발생함
- 부하를 최소화하기 위해 데이터 삭제라는 개념에서 인덱스를 사용하지 않는다는 작업으로 관리함
- INSERT: 새로운 데이터에 대한 인덱스를 추가함
- DELETE: 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업 진행
- UPDATE: 기존의 인덱스를 사용하지 않음 처리하고 갱신된 데이터에 대해 인덱스를 추가
인덱스 생성 전략
- 조건절에 자주 등장하는 칼럼
- 항상 '='으로 비교되는 칼럼
- 중복되는 데이터가 최소한인 칼럼
- ORDER BY 절에서 자주 사용되는 칼럼
- 조인 조건으로 자주 사용되는 칼럼
인덱스의 자료구조
해시 테이블
- Key, Value로 데이터를 저장하는 자료구조 빠른 데이터 검색이 필요할 때 유용함
- 제한적으로 사용되는데 그 이유는 '=' 연산에만 특화되어 있기 때문
- '<', '>' 연산이 자주 사용되는 데이터베이스 검색에는 해시 테이블이 적합하지 않음
B+Tree
- DB인덱스를 위해 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조
- 모든 노드에 데이터를 저장했던 B-Tree와는 다른 특성을 가짐
- 데이터 노드만 인덱스와 함께 데이터(value)를 가지고 있고 인덱스 노드들은 데이터를 위한 인덱스(key)만 가지고 있음
- 무조건 데이터가 있는 데이터 노드까지 가야 하는 단점은 존재함
- 데이터 노드들은 LinkedList로 연결되어 있음 데이터 순회가 쉬움
- 데이터 노드의 크기는 인덱스 노드의 크기와 같지 않아도 됨
- 인덱스 칼럼은 부등호를 이용한 순차 검색 연산에 자주 발생될 수 있음
- 이러한 이유로 시간 복잡도가 O(1)인 해시 테이블에 비해 시간 복잡도는 O(logn)이지만 해시 테이블보다 인덱싱에 더 적합한 자료구조
'CS' 카테고리의 다른 글
카디널리티와 인덱싱 (0) 2022.11.03 [CS study] 2022.06.29 (0) 2022.06.29 [CS study] 2022.06.13 (0) 2022.06.13 [CS study] 2022.06.08 (0) 2022.06.08 [CS study] 2022.06.01 (0) 2022.06.01