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 등에 활용되는 모든 컬럼이 인덱스의 구성 요소인 경우를 말한다.
예를들어, z 열이 있는 테이블의 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
인덱스 (데이터베이스) - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 인덱스(영어: 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