데이터베이스 인덱싱이란?
Database
목록 보기숨기기1/2
- 데이터베이스 인덱싱이란?
- MySQL과 MongoDB의 차이를 알아보자.
데이터베이스 인덱싱이란?
데이터베이스 인덱싱은 데이터베이스 내에서 데이터를 효율적으로 검색하고 관리하기 위해 사용하는 데이터 구조이다.
인덱스는 테이블의 한 열(또는 열의 조합) 에 대한 데이터베이스 오브젝트로, 데이터를 빠르게 찾을 수 있도록 도와, 쿼리 성능을 크게 향상시킬 수있다.
간단한 비유로 일반적으로 책의 목차로 들 수 있다. '이것이 자바다' 라는 책에서 '컬렉션과 제네릭' 페이지를 읽고 싶을 때, 책의 목차가 없다면 첫 장부터 훑어야 할 것이다.
목차가 있다면 몇 페이지인지 알고 있어 한 번에 찾아갈 수 있다.
인덱싱의 원리
인덱스는 일반적으로 다음과 같은 데이터 구조로 구현된다.
-
B-트리(Balanced-Tree) : 가장 일반적인 인덱스 구조. 균형 잡힌 트리 구조를 유지하며, 노드 간 검색이 빠르다. 이 구조는 데이터베이스가 디스크 I/O를 최소화하면서도 빠른 검색, 삽입, 삭제를 할 수 있게 한다.
-
해시(Hash) : 해시 테이블을 사용하여 key-value 쌍을 매핑한다. 이는 특정 값을 빠르게 검색하는 데 매우 효율적이지만, 범위 쿼리에는 적합하지 않다.
-
비트맵(Bitmap) : 비트맵 인덱스는 각 값에 대해 비트맵을 사용하여 여러 열에서 동일한 값의 빈도를 추적한다. 이는 읽기 전용 또는 덜 빈번히 업데이트되는 데이터에 유용하다.
-
GiST, GIN, SP-GiST : PostgreSQL에서 사용되는 인덱스 유형으로, 범위 쿼리, 유사 검색 및 공간데이터에 유용하다.
대부분의 DBMS에서 사용하는 인덱스 구조는 B-Tree 구조이다.
B-Tree 인덱스 구조는 단일 값 검색, 범위 쿼리, 정렬된 결과 반환, 중복된 값 허용하여 조회하는 경우에 매우 효율적이다.
성능 향상
인덱스를 사용하면 데이터베이스 성능을 아래와 같은 방법으로 향상시킬 수 있다.
- 검색 속도 향상 : 인덱스는 데이터를 빠르게 검색할 수 있도록 한다. 인덱스가 없으면 데이터베이스는 테이블의 모든 행을 검사해야 하는 풀 테이블 스캔(full table scan)을 수행해야 한다.
- 정렬 및 범위 쿼리 최적화 : 인덱스는 데이터를 정렬된 순서로 저장하므로 ORDER BY 절 및 범위 쿼리에 대해 최적화된 성능을 제공한다.
- 조인 최적화 : 인덱스는 테이블 간의 조인 연산을 효율적으로 수행할 수 있게 도와준다.
인덱스와 기본키(PK)의 연관성
기본키(Primary Key)는 테이블의 각 행을 고유하게 식별하는 열 또는 열의 조합이다. 기본 키에는 자동으로 고유 인덱스가 생성된다.
기본키와 인덱스의 관계는 아래와 같다.
- 고유성 : 기본 키는 고유성을 보장하며 이를 통해 중복된 데이터가 입력되지 않도록 한다.
- 기본 인덱스 제공 : 데이터베이스는 기본 키에 대해 기본적으로 클러스터형 인덱스(clustered index)를 생성한다. 이는 데이터가 테이블에 물리적으로 저장되는 순서와 일치하는 인덱스이다.
- 빠른 접근 : 기본 키 인덱스를 통해 기본 키 열을 기준으로 하는 검색이 매우 빠르게 이루어질 수 있다.
클러스터형 인덱스란?
클러스터형 인덱스는 데이터베이스에서 테이블의 데이터가 인덱스의 순서에 따라 물리적으로 정렬된 형태를 의미한다.
이는 일반적인 비클러스터형 인덱스와는 다른 특성을 가지고 있다.
클러스터형 인덱스의 특징
- 데이터 정렬 : 클러스터형 인덱스는 테이블의 데이터를 인덱스 키 값에 따라 물리적으로 정렬한다. 이로 인해 검색, 범위 쿼리, 그리고 순차적인 데이터 접근이 매우 빠르다.
- 하나의 클러스터형 인덱스 : 각 테이블은 하나의 클러스터형 인덱스만 가질 수 있다. 이는 테이블의 물리적인 정렬 순서가 하나로 고정되기 때문이다.
- 기본 키와 클러스터형 인덱스 : 기본 키는 자동으로 클러스터형 인덱스를 생성한다. 하지만 기본 키가 아닌 다른 열을 클러스터형 인덱스로 설정할 수 도 있다.
- I/O 효율성 : 데이터가 정렬되어 있기 때문에 범위 쿼리나 순차적인 데이터 접근 시 디스크 I/O가 최소화된다.
인덱스의 단점과 고려사항
인덱스는 항상 좋은 것만은 아니다. 아래와 같은 단점도 존재한다.
- 공간 사용 : 인덱스는 추가적인 저장 공간을 필요로 한다. 테이블에 인덱스가 많아질수록 저장 공간이 증가한다.
- 쓰기 성능 저하 : 인덱스는 데이터 삽입, 업데이트 및 삭제 시 추가적인 작업을 필요로 한다. 인덱스를 유지 관리하는 데 비용이 들기 때문에 성능이 저하될 수 있다.
- 과도한 인덱싱 : 너무 많은 인덱스를 생성하면 데이터베이스 성능이 오히려 저하될 수 있다. 필요하지 않은 인덱스는 바로바로 제거하자.
데이터베이스 인덱싱은 성능 최적화의 핵심 기술이다.
적절한 인덱스를 사용하면 쿼리 성능을 극대화할 수 있지만, 잘못된 인덱스 설계는 오히려 성능을 저하시키고 관리 복잡성을 증가시킬 수 있다.
따라서 인덱스의 사용은 데이터베이스의 특정 사용 패턴과 요구 사항을 고려하여 신중하게 결정해야 한다.
댓글
댓글을 불러오는 중…