이번 글 주제는 DB 인덱스를 저의 개인 E-Commece 프로젝트에 사용하여 성능을 비교 해보고 적절한 인덱스를 적용해보는 과정을 정리한 글이므로 인덱스에 대한 개념설명은 블로그 글과 항해플러스 과정을 학습하며 정리하는 목적으로 간단하게 작성하였습니다.
1. 인덱스란?
DB의 인덱스란
- 데이터의 저장의 성능을 희생하는 대신 검색(조회) 속도를 향상시키기 위한 자료구조
- 인덱스 생성 시 DB 크기의 약 10% 정도되는 추가 공간이 필요할 수 있다.
- 특정 컬럼으로 인덱스를 설정하면,해당 컬럼의 값을 정렬하여 데이터를 적재하는 형태
- 1~100까지의 수를 랜덤하게 펼쳐두고 30보다 작은 값을 찾기
- 1~100까지의 수를 오름차순으로 정렬하고 30보다 작은 값을 찾기
- 인덱스는 조회 성능을 높일 수 있지만 아래 사항들을 고려해야 한다.
- 한번에 찾을 수 있는 값 - 데이터 중복이 적은 컬럼
- 인덱스 재정렬 최소화 - 데이터 삽입, 수정이 적은 컬럼
- 인덱스의 목적은 검색 - 조회에 자주 사용되는 컬럼
- 너무 많지 않은 인덱스 - 인덱스 또한 공간을 차지함
✅ 다량의 트래픽이 유입될 때, 데이터의 조회 쿼리 성능은 인덱스의 사용유무에 따라 엄청난 차이를 나타낼수 있다.
1-1. 효율적인 인덱스 설계
- WHERE 절에 사용되는 열 (WHERE 절에 사용되는 열이라도 자주 사용해야 효율이 좋음)
- SELECT 절에 자주 등장하는 컬럼들을 잘 조합해서 INDEX로 만들어두면 INDEX 조회 후 다시 데이터에서 조회할 필요가 없으므로 빠르게 검색이 가능하다.
- JOIN절에 자주 사용되는 열에는 인덱스의 효율이 좋다.
1-2. 피해야하는 인덱스 설계
- 대용량 데이터가 자주 입력되는 경우
- 데이터 중복도가 높은 열은 인덱스 효과가 미미하다.
- 조회가 자주 사용되는 곳이 아니면 성능 저하를 초래할 수 있다.(INSERT 쿼리만 많고, 조회가 없으면 데이터 입력 시 비효율적인 작업량만 늘어날 수 있다)
1-3. index를 이용한 조회시 유의사항
📌 1. 인덱스 컬럼의 값과 타입을 그대로 사용하기 (인덱스는 컬럽의 값만 알고 있기 때문)
## price 컬럼에 Index 가 적용된 경우
# 올바른 인덱스 사용
where price > 10000 / 100; // price 컬럼에 대한 Index Search
## 잘못된 인덱스 사용(연산)
where price * 100 > 10000; // price * 100 에 대한 Index x
📌 2. LIKE, BETWEEN, <, > 등 범위 조건의 컬럼은 Index 가 적용되나 그 뒤 컬럼은 Index 적용 x
ps.) 범위 조건을 사용할 경우, Index 사용에 유의하자
## Index(order_id, ordered_at, status)
where order_id = 1 and ordered_at > '2025-01-01' and status = 'COMPLETE'
## 인덱스 저장 형상
1 2024-01-01 COMPLETE
1 2024-01-01 READY
1 2024-01-01 READY
1 2024-01-01 READY
1 2024-01-01 READY
1 2024-01-01 READY
1 2024-01-01 READY
1 2024-01-02 COMPLETE
2 2024-01-02 COMPLETE
3 2024-01-03 READY
3 2024-01-04 COMPLETE
## order_id = Index
## ordered_at = Index
## status = Index X
# TIP: datetime, id 처럼 카디널리티가 높은(데이터중복도가 낮은) 필드 이후에는
# 복합인덱스를 추가해도 의미 없는 인덱스가 될 확률이 매우 높음
📌 3. AND 는 ROW 를 줄이지만 OR 는 비교를 위해 ROW 를 늘리므로 Full-Scan 발생확률이 높음
📌 4. =, IN 은 다음 컬럼도 인덱스를 사용한다.
✅ Covering Index
조회하고자 하는 모든 컬럼이 조회 대상, 조회 조건에 포함된다면 데이터를 찾기 위해 ROW 에 접근할 필요가 없으므로 높은 성능의 조회를 달성할 수 있다.
내 E-commerce 개인 프로젝트의 Index 적용은 다음 글에서..
[참고 글]
- 항해 플러스 백엔드플러스
'Database' 카테고리의 다른 글
| Index로 조회 성능을 최적화 해보자(2) (0) | 2025.02.11 |
|---|---|
| 캐시(Cache)란 무엇일까? (1) | 2025.02.03 |