Backend
home
📇

인덱스란?

생성 일시
2025/05/21 13:55
태그
Database
게시일
2025/05/21
최종 편집 일시
2025/05/21 14:27

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)으로 항상 효과 검증