티스토리 뷰
인덱스란
데이터베이스에서의 인덱스는 데이터를 빠르게 찾기 위한 색인이다. 일상 생활에서 책 내용을 찾을려면 처음부터 끝까지 모두 확인하는게 아닌 책 뒤의 특정 단어(색인)를 통해 바로 찾을 수 있다. 데이터베이스의 인덱스도 이와 동일한 개념이다.
인덱스 동작 원리
대부분의 관계형 데이터베이스에서 인덱스는 B+ Tree 구조를 사용하며, 원본 테이블과는 별개의 특수한 자료 구조다. 인덱스는 지정된 컬럼의 값과, 해당 값을 가진 실제 데이터 행의 위치(예: 주소값, 포인터,pk 등)를 한 쌍으로 지정하고, 인덱스 내부의 데이터는 항상 정렬된 상태를 유지한다. (아래는 items 테이블과 items 테이블의 item_name으로 인덱스를 나타낸 그림이다.)

앞서 인덱스는 B+ Tree 구조를 가지고 있다고 했는데 여기서 B+ Tree 구조를 간단히 나타내면 아래와 같다.

위의 자료구조를 통해 데이터를 조회 하는 방식은 아래과 같으며 알고리즘의 효율성을 나타내는 수학적 표기법으로 나타내면 O(log n)과 같다.
- 2개의 데이터 2로 1번 나누기, log₂(2)=1
- 4개의 데이터 2로 2번 나누기, log₂(4)=2
- 8개의 데이터 2로 3번 나누기, log₂(8)=3
- 16개의 데이터 2로 4번 나누기, log₂(16)=4
- ...
- 16,384개의 데이터 2로 14번 나누기, log₂ (16384)=14
- ...
- 1,000,000개의 데이터 2로 약 20번 나누기, log₂ (1,000,000)≈19.93
- 100,000,000개의 데이터 2로 약 27번 나누기, log₂ (100,000,000)≈26.57
이렇게 인덱스를 사용하게 되면 데이터가 많아질수록 차이가 극적으로 커지게 된다.
인덱스 생성, 조회, 삭제
-- 생성
CREATE INDEX 인덱스이름 ON 테이블이름 (컬럼1, 컬럼2, ...);
-- 조회
SHOW INDEX FROM 테이블이름;
-- 삭제
DROP INDEX 인덱스이름 ON 테이블이름;
인덱스 장점
1. 조회 속도가 압도적으로 빨라진다
-> 인덱스가 있으면 B+ Tree 구조를 이용해 조회 속도가 빠르지만 인덱스가 없으면 Full Table Scan으로 전체 테이블을 순차적으로 읽어야 한다.
2. WHERE 조건 검색이 빨라진다.
-> 검색 조건에 사용되는 컬럼에 인덱스가 있으면 빨라진다. (반드시 인덱스에 WHERE 조건할 컬럼이 있어야 한다.)
3. 정렬이 빨라질 수 있다.
-> 인덱스가 없으면 전체 데이터 조회 후 정렬을 해야 하지만 인덱스가 있으면 이미 정렬된 인덱스 순서를 사용하기 때문에 정렬 비용이 크게 감소한다. (이것도 반드시 ORDER BY 할 컬럼이 인덱스에 있어야 한다.)
4. JOIN 성능 향상
SELECT *
FROM orders o
JOIN users u
ON o.user_id = u.id;
user_id나 id에 인덱스가 있으면 JOIN할 사용자 테이블 위치를 즉시 탐색하기 때문에 성능이 향상 된다. 참고로 MYSQL에서는 PRIMARY KEY (기본 키)나 FOREIGN KEY (외래 키) 제약조건을 설정하면, 해당 컬럼에 대해 자동으로 인덱스를 생성한다. UNIQUE 제약조건도 마찬가지로 인덱스가 생성된다.)
인덱스 단점
1. 저장 공간을 추가로 사용한다.
-> 만약 테이블이 하나가 있고 인덱스를 N개 생성하였으면 인덱스 별도로 N개의 저장 공간이 필요하게 된다.
2. INSERT, UPDATE, DELETE가 느려진다.
-> 테이블에 삭제, 수정, 삭제를 하게 되면 생성된 인덱스 내부 데이터를 추가, 수정, 삭제를 해야하고 추가로 트리를 재정렬 해야하기 때문에 추가 비용이 발생하게 된다.
정리
인덱스는 데이터베이스에서 특정 데이터를 빠르게 찾기 위해 만드는 "색인"이며, 보통 B+ Tree 자료구조를 사용하여 전체 데이터를 훑는 O(N) 탐색을 O(log N) 수준으로 줄여 성능을 크게 향상시킨다. 대신 저장 공간을 추가로 사용하고 INSERT/UPDATE/DELETE 성능은 일부 감소한다.
본 포스팅은 “김영한의 실전 데이터베이스 기본편/인프런”를 학습한 내용을 정리한 것
'DB > DB' 카테고리의 다른 글
| <DB> 커버링 인덱스란? (0) | 2026.06.14 |
|---|---|
| <DB> 뷰(View)이란? (0) | 2026.03.14 |