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