인덱스
추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의
검색 속도를 향상시키기 위한 자료구조이며, 테이블의 컬럼을 색인화(책의 목차와 비슷하다)한다.
즉, 데이터의 주소값을 저장하는 별도의 특별한 자료구조이다. index를 활용해서 빠르게 원하는 데이터를 찾을 수 있다.
인덱스를 사용하는 이유
일상생활에서의 인덱스
먼저 위에서 말했듯이 인덱스는 책의 목차와 비슷하다.
우리가 원하는 내용을 찾기 위해 책을 폈다고 생각해보자,
우리는 목차를 먼저 확인하고 목차에서 원하는 단원을 확인 후 그 페이지로 이동한다.
만약 목차가 없다면 책 전체를 다시 한 번 확인해야 하는데 그렇게 된다면 시간이 너무 오래 걸린다.
목차가 있다면 원하는 페이지로 이동하는 시간이 책이 두꺼울수록 더 많이 단축될 것이다.
데이터베이스에서의 인덱스
DB에서도 비슷하게 작동한다.
만약 인덱스가 안 걸려 있다면 full scan방식으로 모든 데이터를 하나씩 확인해야 한다.
하지만 책에서와같이 시간이 너무 오래 걸린다.
즉, 인덱스는 full scan이 아닌 B+Tree, HashTable 등의 자료구로를 사용하기 때문에 더 빠른 결과를 얻을 수 있다.
인덱스를 사용하면 좋은 경우
- 규모가 작지 않은 테이블
- INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
- JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
- 데이터의 중복도가 낮은 컬럼
인덱스의 관리
DBMS는 index를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있으며,
인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE가 수행된다면 각각 다음과 같은 연산을 추가적으로 해주어야 하며 그에 따른 오버헤드가 발생한다.
- INSERT : 새로운 데이터에 대한 인덱스를 추가한다.
- DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행한다.
- UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가한다.
인덱스 사용 장단점
장점
- 빠른 검색 속도 : 전체 테이블을 스캔하는 대신 인덱스 트리를 사용하여 더 빠르게 원하는 데이터를 찾을 수 있다.
- 쿼리 성능 향상 : 쿼리에서 WHERE 절과 ORDER BY 절에 인덱스를 생성하면 쿼리의 성능이 향상될 수 있다.
- 유일성 보장 : 유일한 값을 가지는 열에 대한 인덱스를 생성하면 데이터의 중복을 방지하고 데이터의 일관성을 유지할 수 있다.
단점
- 저장 공간 사용 : DB 에 저장되는 구조이므로 저장 공간을 차지하고, 테이블이 크고 인덱스가 많을 경우 저장 공간이 증가할 수 있다.
- 업데이트 및 삽입 비용 : 데이터를 업데이트하거나 새로운 데이터를 삽입할 때 인덱스도 업데이트되어야 하기 때문에 데이터 변경 작업의 비용이 증가할 수 있다.
- 인덱스 유지 관리 오버헤드 : DB 에서 관리되어야 하므로 인덱스의 유지 관리에 대한 오버헤드가 발생할 수 있으며, 특히 데이터베이스가 크고 인덱스가 많을 경우 이러한 오버헤드가 증가할 수 있습니다.
인덱스 자료구조
B-Tree
SELECT a FROM TEMP WHERE a = 7;
- 인덱스는 정렬된 상태로 정렬되어 있고 풀스캔 방식이 아닌 이분탐색으로 테이블의 반을 갈라 확인한다.
- 딱 반을 갈랐을 경우 a가 7 이므로 중복된 값이 없는 경우 바로 반환한다.
SELECT a FROM TEMP WHERE a = 7 AND b = 95;
- 반을 갈라 a가 7인 경우를 찾는다.
- 테이블에서 b의 값을 확인한다.
- 아니므로 앞이나 뒤의 경우 둘 다 확인한다.
- 바로 뒤에 나왔어도 똑같은 값이 존재할 수 있기 때문에 a가 7인 경우를 찾는다.
- 이 방식은 너무 복잡해 지므로 a와 b를 묶어서 인덱스를 설정하는 게 좋다.
a와 b를 같이 설정하는 경우
- 반을 가르고 a가 7인 경우 찾는다.
- 인덱스에서 바로 b의 값을 비교한다.
- 원하는 b의 값을 찾았을 경우 테이블에서 바로 찾는다.
B+Tree
B-Tree는 탐색을 위해서 노드를 찾아서 이동해야 한다는 단점을 가지고 있다.
이 단점을 보완한 B+Tree는 같은 레벨의 모든 키값들이 정렬되어 있고, 같은 레벨의 노드는 연결리스트 형태로 이어져 있다.
출처
'CS > 데이터베이스' 카테고리의 다른 글
커넥션 풀 (0) | 2024.04.04 |
---|---|
조인 (0) | 2024.04.04 |
저장 프로시저, 트리거 (0) | 2024.03.27 |
Schema (0) | 2024.03.26 |
RDB - NoSQL 차이점 (1) | 2024.03.18 |