Index란?
인덱스는 DB에서 데이터를 빨리 찾기 위한 지도 같은 것이다.
인덱스가 없을 경우 DB는 모든 행을 하나씩 다 검색해야 한다.
그와 다르게 인덱스가 있을 경우 정리된 지도(인덱스)를 보고 훨씬 빨리 몇 번의 비교만으로 해당 데이터를 찾을 수 있다.
이 경우에는 데이터가 아무리 많더라도 속도가 크게 떨어지지 않는 장점이 있다.
단점으로는 데이터가 추가 될 때마다 인덱스를 관리해줘야 한다는 것이 있다.
(자주 갱신되는 컬럼의 경우에는 트리 구조 재정렬이 매번 같이 필요하기 때문에 비효율적이다.)
인덱스는 테이블과 별도의 자료 구조로 관리 되며, B-Tree 알고리즘을 사용한다.
B-Tree에 대해
인덱스는 단순히 가나다순 정렬이 아니라, 검색을 위해 데이터를 분할·정렬·균형 유지하는 탐색 트리다.
데이터를 순서대로 정리해두고 한 번에 많이 비교하면서 적은 횟수로 빨리 찾게 해주는 트리 구조를 가지고 있다.

실습
테이블 만들면서 인덱스도 같이 생성해준다.
CREATE TABLE users (
id BIGINT PRIMARY KEY,
name VARCHAR(50),
age INT,
city VARCHAR(50),
INDEX idx_name (name),
INDEX idx_age (age)
);
유저 데이터를 넣어준다.
INSERT INTO users (id, name, age, city)
VALUES
(1, 'Viva', 30, 'Seoul'),
(2, 'Ravi', 29, 'Busan'),
(3, 'Viva', 25, 'Incheon'),
(4, 'Minho', 30, 'Daegu');
Unique Scan 실습
EXPLAIN FORMAT=TRADITIONAL SELECT * FROM users WHERE id = 1;
id는 Primary Key이기 때문에 옵티마이저가 자동으로 Unique Scan 선택한다.
Unique Scan은 정확한 주소로 이동하므로 가장 빠르게 탐색이 가능하다.
결과 예시

Range Scan 실습
EXPLAIN FORMAT=TRADITIONAL SELECT * FROM users WHERE age BETWEEN 20 AND 30;
age 컬럼에 인덱스가 존재하기 때문에 옵티마이저가 Range Scan 선택한다.
B-Tree에서 20의 위치를 찾고, 그 이후 데이터를 순서대로 탐색한다.
결과 예시

Table Full Scan 실습
EXPLAIN FORMAT=TRADITIONAL SELECT * FROM users WHERE city = 'Seoul';
인덱스가 없기 때문에 옵티마이저가 인덱스를 사용할 수 없다.
Full Table Scan은 모든 행을 하나씩 확인해야 해서 데이터가 많아질수록 급격히 느려진다.
결과 예시

'💻 Backend > 이론 및 실습' 카테고리의 다른 글
| 캐싱 개념 및 필요성 (0) | 2026.04.01 |
|---|---|
| 복합 인덱스 (0) | 2026.03.31 |
| QueryDSL 검색 기능 구현 (0) | 2026.03.30 |
| QueryDSL 개념 및 적용 (0) | 2026.03.30 |
| VPC EC2 생성 (0) | 2026.03.10 |