본문 바로가기

게으른개발자/공부

DB(PostgreSQL) 인덱스와 활용방법 (컴포지트 인덱스, 커버링 인덱스)

DB를 활용하다 보면 빠른 동작을 위해 인덱스를 많이 활용합니다.

컬럼에 인덱스를 생성하면 빠르게 검색된다는건 알지만,  그 장점을 잘 활용못하는 경우가 많아 작성해보았습니다.

 

DB 인덱스란?

 

 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조

 

자료 구조 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 자료구조(資料構造, 영어: data structure)는 컴퓨터 과학에서 효율적인 접근 및 수정을 가능케 하는 자료의 조직, 관리, 저장을 의미한다.[1][2][3] 더 정확히 말해,

ko.wikipedia.org

 

 

인덱스 활용 방법

1.  컴포지트 인덱스 (Composite Index )  vs  인덱스 머지 (Index merge)

  • 컴포지트 인덱스 (Composite Index ): 두 개 이상의 컬럼에 대하여 생성한 인덱스   
CREATE INDEX ON table (column_a, column_b)
  • 인덱스 머지 (Index merge): 개별 컬럼에 인덱스를 생성하여 모두 WHERE절에 사용
CREATE INDEX ON table (column_a)
CREATE INDEX ON table (column_b)

 

Q. 위의 두가지 인덱스 방식중에 어떤게 더빠를까?
A. 인덱스 머지보다 컴포지트 인덱스(Composite Index )가 10배 빠름

 

why?

PostgreSQL 인덱스 머지가 들어가는 쿼리에 대해서 인덱스-온리 스캔을 지원하지 않기 때문 (MySQL보다 PostgreSQL에서 차이가 더 큼)

 

Example

1천만개 레코드 삽입후 아래의 쿼리 실행

SELECT count(*) FROM table WHERE int1000 = 1 AND int100 = 1 쿼리에 대해서

# 컴포지트 인덱스 : 5ms
# 인덱스 머지 : MySQL은 30~40ms, PostgreSQL는 30~90ms

 

2.  커버링 인덱스 (Covering Index 혹은 Covered Index)

  • 커버링 인덱스는 쿼리를 충족하는데 필요한 모든 데이터를 갖는 인덱스를 뜻한다. SELECT / WHERE / GROUP BY / ORDER BY 등에 활용되는 모든 컬럼이 인덱스의 구성 요소인 경우를 말한다.

예를들어, 열이 있는 테이블의 x  y 열에 인덱스가 있는 경우

SELECT x, y FROM tab WHERE x = 'key';   # 커버링 인덱스 (O)
SELECT x FROM tab WHERE x = 'key' AND y < 42;  # 커버링 인덱스 (O)
SELECT x, z FROM tab WHERE x = 'key';  # 커버링 인덱스 (X)
SELECT x FROM tab WHERE x = 'key' AND z < 42;  # 커버링 인덱스 (X)

 

 

참조

https://sirupsen.com/index-merges

 

Index Merges vs Composite Indexes in Postgres and MySQL

Index Merges vs Composite Indexes in Postgres and MySQL Nov 2022 Composite indexes aka multi-column indexes are about 10x faster than index merges. In Postgres, the gap is larger than in MySQL because Postgres doesn't support index-only scans for queries t

sirupsen.com

https://ko.wikipedia.org/wiki/%EC%9D%B8%EB%8D%B1%EC%8A%A4_(%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4) 

 

인덱스 (데이터베이스) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 인덱스(영어: index)는 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조를 일컫는다. 인덱스는 테이블 내의 1개의 컬럼, 혹은 여러

ko.wikipedia.org

https://www.youtube.com/watch?v=zMAX7g6rO_Yhttps://www.youtube.com/watch?v=zMAX7g6rO_Y 

https://runebook.dev/ko/docs/postgresql/indexes-index-only-scans

 

PostgreSQL - 11.9. 인덱스 전용 스캔 및 커버링 인덱스 모든 인덱스 PostgreSQL은 각각이 테이블의 기본

Documentation Contributors History

runebook.dev

https://simpledb.tistory.com/76

 

액세스 방식

Seq Scan 방식 ▪ Seq Scan은 테이블을 Full Scan 하면서 레코드를 읽는 방식이다. ▪ 인덱스가 존재하지 않거나, 인덱스가 존재하더라도 읽어야 할 범위가 넓은 경우에 선택한다. Index Scan 방식 ▪ Index S

simpledb.tistory.com

https://overcome-the-limits.tistory.com/698

 

[Project] 프로젝트 삽질기17 (feat Table Scan 실행계획)

들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 그 과정에서 설정한 Index가 제대로 동작하는지 알기 위해, 그리고 효과적으로 커버링 인덱스를 적용하기 위해

overcome-the-limits.tistory.com

 

'게으른개발자 > 공부' 카테고리의 다른 글

Kafka Streams 파티션 할당 과정  (2) 2024.10.18
DB three-valued logic (NULL의 의미)  (0) 2023.03.26
gRPC 간단 정리와 예제  (0) 2023.02.25
OSI 7Layer와 L1, L2, L3, L4, L7 스위치  (0) 2022.10.30
REST vs. RESTful  (0) 2022.09.13