IT이야기/데이터베이스

SQL 인덱스(INDEX): 데이터베이스 성능을 높이는 핵심 기술

Chiba-in 2025. 2. 27. 11:36

🔹 인덱스(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 성능이 저하될 수 있으므로 주의해야 한다.