SQL 인덱스(INDEX): 데이터베이스 성능을 높이는 핵심 기술
🔹 인덱스(INDEX)란?
1. 인덱스(INDEX)의 정의
**인덱스(INDEX)**는 데이터베이스에서 검색 성능을 향상시키기 위해 사용하는 자료구조입니다.
책의 목차(Index)와 유사한 개념으로, 데이터를 빠르게 찾을 수 있도록 특정 열(Column)에 대한 정렬된 구조를 제공합니다.
✅ 인덱스의 주요 역할:
- 검색 성능 향상 🚀
- 데이터 조회 속도 최적화
- WHERE, JOIN, ORDER BY 등의 쿼리 성능 개선
- 불필요한 풀 테이블 스캔(Full Table Scan) 방지
📌 인덱스는 검색 성능을 최적화하지만, 너무 많으면 데이터 삽입·삭제·수정 시 성능이 저하될 수 있음
🔹 인덱스의 동작 방식
✅ 1. 인덱스가 없는 경우 (Full Table Scan)
인덱스가 없으면 WHERE 조건을 만족하는 데이터를 찾기 위해 모든 행(Row)을 탐색해야 합니다.
예를 들어, 아래와 같은 테이블이 있다고 가정합니다.
✔️ 샘플 테이블 (Users)
CREATE TABLE Users (
UserID INT PRIMARY KEY,
Name VARCHAR(100),
Email VARCHAR(255),
Age INT
);
✔️ 인덱스 없이 조회
SELECT * FROM Users WHERE Name = 'Alice';
📌 인덱스가 없으면 모든 행을 하나씩 검사(Full Table Scan) → 검색 속도가 느림
✅ 2. 인덱스를 사용한 검색 최적화
✔️ 인덱스 생성
CREATE INDEX idx_users_name ON Users (Name);
✔️ 인덱스를 활용한 조회
SELECT * FROM Users WHERE Name = 'Alice';
📌 이제 데이터베이스는 idx_users_name 인덱스를 사용하여 빠르게 데이터를 찾을 수 있음
🔹 인덱스의 종류
1. B-Tree 인덱스 (Balanced Tree)
✅ 가장 일반적으로 사용되는 인덱스 구조
✅ 트리(Tree) 구조로 되어 있어 데이터 검색이 빠름
✅ MySQL, PostgreSQL, Oracle 등 대부분의 DBMS에서 기본 인덱스로 사용됨
✔️ B-Tree 인덱스 생성 (MySQL 예제)
CREATE INDEX idx_users_email ON Users (Email);
📌 검색 연산 (=, <, >, BETWEEN, LIKE 'abc%')에서 효과적
2. 해시(Hash) 인덱스
✅ 해시 테이블(Hash Table) 구조를 활용하여 검색 속도를 높임
✅ = 연산에 최적화 (범위 검색, 정렬에는 부적합)
✅ 메모리 기반 데이터베이스에서 주로 사용됨 (ex. Redis)
✔️ 해시 인덱스 생성 (PostgreSQL 예제)
CREATE INDEX idx_users_hash ON Users USING HASH (Email);
📌 WHERE 조건에 =(Equal) 연산이 많은 경우 효과적
3. 비트맵(Bitmap) 인덱스
✅ 컬럼의 값이 몇 가지로 제한된 경우(예: 성별, 국가코드 등) 최적화된 인덱스
✅ 데이터 웨어하우스 등 분석 시스템에서 주로 사용됨
✅ Oracle에서 지원 (MySQL, PostgreSQL에서는 미지원)
✔️ 비트맵 인덱스 생성 (Oracle 예제)
CREATE BITMAP INDEX idx_users_gender ON Users (Gender);
📌 성별(Gender = 'M' OR Gender = 'F') 같은 Low-Cardinality 데이터에서 효과적
4. 클러스터형(Clustered) vs 비클러스터형(Non-Clustered) 인덱스
구분 설명
클러스터형 인덱스 (Clustered Index) | 테이블의 데이터 자체를 정렬된 상태로 저장 |
비클러스터형 인덱스 (Non-Clustered Index) | 인덱스가 데이터와 별도로 저장됨 |
✔️ 클러스터형 인덱스 예제
CREATE CLUSTERED INDEX idx_orders_date ON Orders (OrderDate);
📌 한 테이블에 하나의 클러스터형 인덱스만 존재 가능
✔️ 비클러스터형 인덱스 예제
CREATE INDEX idx_orders_customer ON Orders (CustomerID);
📌 비클러스터형 인덱스는 여러 개 생성 가능
🔹 인덱스의 실무 활용 사례
1. 대량 데이터 검색 최적화
✅ 이메일 기반 로그인 시스템
CREATE INDEX idx_users_email ON Users (Email);
SELECT * FROM Users WHERE Email = 'test@example.com';
📌 이메일 검색 속도가 대폭 향상됨
2. JOIN 성능 최적화
✅ 주문(Order)과 고객(Customer) 테이블 조인 최적화
CREATE INDEX idx_customers_id ON Customers (CustomerID);
CREATE INDEX idx_orders_customer ON Orders (CustomerID);
SELECT * FROM Orders
JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
📌 JOIN 성능이 크게 향상됨
3. ORDER BY / GROUP BY 성능 개선
✅ 날짜 기준 정렬 속도 최적화
CREATE INDEX idx_orders_date ON Orders (OrderDate);
SELECT * FROM Orders ORDER BY OrderDate DESC;
📌 정렬 속도가 개선됨
📌 결론
✅ 인덱스(INDEX)는 SQL에서 검색 성능을 최적화하는 핵심 기술이다.
✅ B-Tree, Hash, Bitmap 등 다양한 인덱스가 있으며, 데이터 특성에 맞게 선택해야 한다.
✅ WHERE, JOIN, ORDER BY, GROUP BY 등의 쿼리 성능을 크게 향상시킬 수 있다.
✅ 단, 너무 많은 인덱스를 생성하면 INSERT/UPDATE/DELETE 성능이 저하될 수 있으므로 주의해야 한다.