업무 중 수많은 공간 정보 데이터를 다루는 상황에서, 특정 조건에 맞는 데이터를 필터링하기 위한 쿼리 작업이 필요했다.
그러나 테이블의 데이터량이 많아지면서(약 600만 건), 단순한 WHERE 조건만으로는 응답 시간이 지나치게 길어져 실무에 불편함을 주었다. 이에 따라, 해당 WHERE 조건에 사용되는 컬럼에 인덱스를 추가하여 성능을 개선하기로 결정하였다.
특히 아래와 같은 상황에서 성능 향상이 절실했다:
- 복잡한 SQL 조건문
- 비지속성 쿼리 반복 호출
- 실시간 필터링 및 데이터 집계
그 결과, 일부 쿼리의 경우 36초 → 0.01초 수준으로 대폭 단축되었다.
✅ 1. 인덱스란?
- 인덱스(Index)는 DB에서 검색 속도를 높이기 위해 사용하는 자료구조이다.
- 책의 목차처럼, 특정 컬럼의 값을 빠르게 찾을 수 있도록 만든 추가적인 정렬 정보라고 보면 된다.
- SELECT 문 실행 시, 테이블 전체를 순회(Full Scan)하는 대신 인덱스를 활용하여 검색 대상 범위를 좁혀줌.
✅ 2. 장단점
| 장점 | 단점 |
| 특정 컬럼 조회 속도 비약적 향상 | INSERT/UPDATE/DELETE 시 인덱스도 함께 관리되어 쓰기 성능 저하 |
| WHERE, JOIN, ORDER BY 시 유리 | 인덱스를 너무 많이 생성하면 오히려 성능 저하 가능 |
| 대량 데이터 테이블에 필수적 | 추가적인 저장 공간 필요 |
✅ 3. 사용 이유 및 위치
📌 사용 이유
- WHERE 조건문 속도 향상
- JOIN 시 대상 컬럼 탐색 최적화
- ORDER BY 시 정렬 성능 개선
📌 사용 위치 (추천)
- WHERE 절에 자주 등장하는 컬럼
- JOIN 시 기준이 되는 컬럼 (PK, FK)
- 정렬에 자주 사용되는 컬럼
✅ 4. 사용 방법
📌 4-1. SQL로 인덱스 생성
-- 기본 문법
CREATE INDEX 인덱스명 ON 테이블명(컬럼명);
-- 단일 인덱스 예시: file_name_idx 컬럼 사용
CREATE INDEX idx_airloc_file ON STO_AIRLOC_DTS(file_name_idx);
-- 복합 인덱스 예시: file_name_idx와 file_path 두 컬럼을 함께 사용
CREATE INDEX idx_airloc_file_path ON STO_AIRLOC_DTS(file_name_idx, file_path);
- 보통 컬럼명이 명확한 경우 idx_테이블_컬럼 형태로 네이밍
- 단일 컬럼 인덱스 외에도, 복합 인덱스 생성 가능
📌 4- 2. DBeaver에서 인덱스 생성하기



✅ 5. 실제 내 프로젝트에서의 효율
테이블의 데이터 건수와 응답 시간은 아래와 같았으며, 인덱스 적용 후 효과가 매우 컸다.
| 건수 | 인덱스 적용 전 | 인덱스 적용 후 |
| 5,981,150 개 | 36 초(s) | 0.011 초(s) |
| 1,182,237 개 | 4 초(s) | 0.008 초(s) |
| 500,298 개 | 1 초(s) | 0.007 초(s) |
'개발' 카테고리의 다른 글
| [Spring/Web] 400 에러, GET vs POST (0) | 2025.08.12 |
|---|---|
| [Maven] Maven, clean install, clean package 이란 (0) | 2025.08.05 |
| [DB SQL] JOIN · WITH 절을 활용한 쿼리 최적화 (0) | 2025.07.31 |
| [Spring Boot] 카카오API를 활용한 검색 기능 구현 (GET/POST 방식) (0) | 2025.07.13 |
| [DBeaver] 행(라인) 번호 표시 (0) | 2025.06.18 |