Index
2026. 3. 31. 18:09

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