DB를 활용하다 보면 빠른 동작을 위해 인덱스를 많이 활용합니다.
컬럼에 인덱스를 생성하면 빠르게 검색된다는건 알지만, 그 장점을 잘 활용못하는 경우가 많아 작성해보았습니다.
DB 인덱스란?
데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조
인덱스 활용 방법
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
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
https://simpledb.tistory.com/76
https://overcome-the-limits.tistory.com/698
'게으른개발자 > 공부' 카테고리의 다른 글
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 |