1. 인덱스란?
인덱스는 데이터베이스 테이블에서 검색 속도를 향상시키기 위한 자료구조이다. 도서관의 책 찾기 방식과 비슷하게, 특정 열(column)에 대한 빠른 탐색을 가능하게 해준다.
인덱스의 핵심 역할
•
WHERE 절의 검색 속도 향상
•
JOIN, ORDER BY, GROUP BY 등의 성능 향상
•
중복 값 제거 및 유니크성 보장 (Unique Index)
인덱스의 구조 (B-Tree 기반)
가장 일반적인 인덱스는 B-Tree 구조를 사용한다. 루트 노드 → 중간 노드 → 리프 노드로 이어지며, 검색 시 O(log n)의 시간 복잡도를 가진다.
2. 기본 예제
-- 예제 테이블 생성
CREATE TABLE users (
id NUMBER PRIMARY KEY,
username VARCHAR2(100),
email VARCHAR2(100),
created_at DATE
);
-- 일반 인덱스 생성
CREATE INDEX idx_users_email ON users(email);
-- 유니크 인덱스
CREATE UNIQUE INDEX idx_users_username ON users(username);
SQL
복사
인덱스 효과
-- 인덱스가 사용되는 쿼리
SELECT * FROM users WHERE email = 'test@example.com';
-- 인덱스가 사용되지 않는 경우 (함수를 쓰면 인덱스 무효)
SELECT * FROM users WHERE LOWER(email) = 'test@example.com';
SQL
복사
⇒ 인덱스를 사용하려면 함수나 계산식을 피하고, 인덱스가 걸린 컬럼을 WHERE 절에서 직접 사용해야 한다.
3. 실무에서 인덱스를 효율적으로 사용하는 방법
1. 조회 빈도가 높은 컬럼에 인덱스 생성
•
고객 ID, 이메일, 상품 코드 등 자주 검색되는 컬럼
•
단, 변동이 적은 컬럼에만 적용 (INSERT/UPDATE 성능 저하 고려)
2. 복합 인덱스 활용
•
여러 컬럼을 묶은 인덱스 - WHERE 절에서 선행 컬럼부터 조건을 걸 때만 사용됨
CREATE INDEX idx_users_email_created ON users(email, created_at);
SQL
복사
3. 커버링 인덱스(Covering Index) 활용
•
인덱스에 포함된 컬럼만으로 결과를 반환할 수 있으면 테이블 접근 없이 조회 가능
-- covering index가 가능한 쿼리
SELECT email, created_at FROM users WHERE email = 'test@example.com';
SQL
복사
4. 인덱스 힌트 사용
인덱스 강제 사용
SELECT /*+ INDEX(users idx_users_email) */ * FROM users WHERE email = 'test@example.com';
SQL
복사
4. 인덱스 사용 시 주의할 점
항목 | 설명 |
너무 많은 인덱스 | INSERT/UPDATE 시 오버헤드 증가 |
함수 사용 | 인덱스 무력화 (e.g. LOWER(name) 등) |
작은 테이블 | 전체 스캔이 더 빠를 수 있음 |
빈번한 변경 컬럼 | 인덱스 유지비용이 높아짐 |
5. 정리
•
자주 조회되는 컬럼 → 인덱스 고려
•
WHERE 절, JOIN 키, ORDER BY 컬럼 → 인덱스 우선 적용
•
복합 인덱스는 선행 조건을 고려한 설계
•
실행계획(EXPLAIN PLAN)으로 항상 효과 검증