PostgreSQL 인덱싱, 성능 향상의 핵심!
데이터베이스 인덱스(Database Index)의 기본 개념과 풀 테이블 스캔(Full Table Scan)의 성능 저하 문제를 설명함
복합 인덱스(Composite Index), 함수 기반 인덱스(Functional Index), 부분 인덱스(Partial Index) 등 다양한 인덱스 유형을 소개함
인덱스 사용 시 성능 저하를 유발하는 흔한 실수와 해결 방법을 제시함
EXPLAIN 명령어를 활용한 쿼리 성능 분석(Query Performance Analysis)의 중요성을 강조함
인덱싱 기본 원리: B-트리(B-tree) 구조
게시물에서는 데이터베이스 인덱스를 과학 교과서의 색인에 비유하며, B-트리(B-tree) 구조를 통해 빠른 데이터 검색을 가능하게 함을 설명한다. 특히, 인덱스를 사용하면 전체 테이블을 스캔하는 대신, 정렬된 데이터를 이진 검색(Binary Search)하여 원하는 데이터를 빠르게 찾을 수 있다. 이러한 구조는 대량의 데이터에서 검색 성능(Search Performance)을 크게 향상시키는 핵심 원리이다.
인덱스 사용 시 흔한 함정: 복합 인덱스(Composite Index)의 이해
게시물은 복합 인덱스(Composite Index) 사용 시 쿼리(Query) 순서에 따른 성능 차이를 강조한다. 예를 들어, (type_1, type_2) 복합 인덱스는 type_1과 type_2를 모두 사용하는 쿼리에는 효과적이지만, type_2만 사용하는 쿼리에는 효과가 떨어진다. 이는 복합 인덱스가 type_1으로 먼저 정렬되기 때문이다. 따라서, 쿼리 패턴(Query Pattern)을 정확히 파악하고 적절한 인덱스를 설계하는 것이 중요하다.
함수 기반 인덱스(Functional Index)와 표현식 인덱스
게시물은 대소문자를 구분하지 않는 검색(Case-insensitive Search)을 위한 함수 기반 인덱스(Functional Index)의 중요성을 강조한다. 일반적인 `WHERE lower(name) = 'pikachu'` 쿼리는 name 컬럼에 대한 인덱스를 사용하지 못한다. 이를 해결하기 위해 `lower(name)`에 대한 표현식 인덱스(Expression Index)를 생성하여 검색 성능을 향상시킬 수 있다. 이는 데이터 변환(Data Transformation)이 필요한 경우 유용한 방법이다.
부분 인덱스(Partial Index)와 커버링 인덱스(Covering Index) 활용
게시물은 부분 인덱스(Partial Index)를 통해 특정 조건에 맞는 데이터에만 인덱스를 적용하여 저장 공간(Storage Space)과 쓰기 성능(Write Performance)을 최적화하는 방법을 제시한다. 또한, 커버링 인덱스(Covering Index)를 사용하면 인덱스만으로 쿼리를 처리하여 I/O 비용(I/O Cost)을 줄일 수 있다. EXPLAIN 명령어를 통해 Index Only Scan을 확인하는 것이 중요하다.