티스토리 뷰
인덱스란 무엇인가? 초보도 이해하는 원리 + 성능 차이
데이터베이스를 공부하다 보면 빠지지 않고 등장하는 개념이 바로 인덱스(Index)입니다. 그런데 처음 배우는 입장에서는 “인덱스를 걸면 빨라진다” 정도로만 이해하고 넘어가는 경우가 많습니다.
문제는 여기서 시작됩니다. 인덱스는 단순히 “무조건 성능을 올려주는 옵션”이 아닙니다. 언제는 엄청 빨라지고, 언제는 오히려 쓰기 성능을 떨어뜨릴 수도 있습니다.
이번 글에서는 인덱스가 무엇인지, 왜 필요한지, 실제로 왜 빨라지는지, 그리고 실무에서 어떤 점을 조심해야 하는지까지 초보 눈높이에서 정리해보겠습니다.
예를 들어 회원 테이블에 100만 건의 데이터가 있다고 가정해보겠습니다.
SELECT *
FROM users
WHERE email = 'ace@example.com';
이때 email 컬럼에 인덱스가 없다면, 데이터베이스는 원하는 값을 찾기 위해 테이블을 처음부터 끝까지 훑어봐야 할 수 있습니다. 이 과정을 보통 Full Table Scan이라고 부릅니다.
반대로 email 컬럼에 인덱스가 있다면, 데이터베이스는 전체를 다 뒤지지 않고 정리된 탐색 경로를 따라 훨씬 빨리 원하는 데이터를 찾을 수 있습니다.
두꺼운 책에서 특정 단어를 찾는다고 가정해보겠습니다.
- 목차나 색인이 없다면 책을 처음부터 끝까지 넘겨봐야 합니다.
- 색인이 있다면 관련 페이지를 바로 찾을 수 있습니다.
데이터베이스 인덱스도 비슷합니다.
- 인덱스 없음 = 전체 페이지를 훑는다
- 인덱스 있음 = 위치 정보를 통해 빠르게 접근한다
즉, 인덱스는 데이터 자체가 아니라 데이터를 빨리 찾기 위한 길잡이라고 보면 됩니다.
인덱스가 빠른 이유는 데이터베이스가 데이터를 찾을 때 전체를 확인하지 않아도 되기 때문입니다.
예를 들어 정렬되지 않은 종이 더미에서 이름을 찾는 것과, 가나다순으로 정리된 명단에서 이름을 찾는 것을 비교해보면 훨씬 직관적입니다.
- 정렬이 안 되어 있으면 하나씩 다 봐야 합니다.
- 정렬되어 있으면 범위를 빠르게 줄일 수 있습니다.
많은 DBMS는 인덱스를 내부적으로 B-Tree 계열 구조로 관리합니다. 초보 단계에서는 “정렬된 탐색 구조” 정도로 이해하면 충분합니다.
예를 들어 아래 쿼리를 보겠습니다.
SELECT *
FROM users
WHERE email = 'ace@example.com';
인덱스가 없으면
users테이블 전체를 읽을 가능성이 큽니다.- 데이터가 많을수록 느려질 수 있습니다.
인덱스가 있으면
email값을 기준으로 빠르게 위치를 찾습니다.- 데이터가 많을수록 성능 차이가 더 크게 느껴질 수 있습니다.
| 구분 | 인덱스 없음 | 인덱스 있음 |
|---|---|---|
| 조회 방식 | 전체를 훑을 가능성 큼 | 필요한 위치를 빠르게 탐색 |
| 데이터 증가 시 | 느려질 가능성 큼 | 상대적으로 안정적 |
| 특징 | 단순하지만 비효율적일 수 있음 | 조회 성능 향상 기대 |
인덱스는 단순히 만들어두고 끝나는 구조가 아닙니다. 테이블 데이터가 바뀌면 인덱스도 같이 관리되어야 합니다.
예를 들어 다음 작업이 발생하면,
- INSERT
- UPDATE
- DELETE
테이블 데이터뿐 아니라 인덱스 구조도 함께 수정해야 합니다. 그래서 인덱스가 많을수록 쓰기 작업은 더 무거워질 수 있습니다.
즉,
- 조회가 많은 서비스에서는 유리할 수 있고
- 쓰기가 매우 많은 서비스에서는 신중해야 합니다.
보통 아래 같은 컬럼이 인덱스 후보가 됩니다.
WHERE절에 자주 등장하는 컬럼JOIN조건에 자주 쓰는 컬럼ORDER BY에 자주 쓰는 컬럼GROUP BY에 자주 쓰는 컬럼- 중복도가 너무 낮지 않은 컬럼
예를 들어
- 이메일 검색이 자주 일어나면
email - 주문 목록을 사용자 기준으로 자주 보면
user_id - 게시글을 작성일 기준으로 자주 정렬하면
created_at
같은 컬럼을 먼저 생각할 수 있습니다.
예를 들어 아래 같은 경우는 신중해야 합니다.
- 데이터 변경이 매우 자주 일어나는 컬럼
- 중복도가 너무 높은 컬럼
- 실제 조회 조건에 거의 쓰이지 않는 컬럼
- 작은 테이블
특히 성별, Y/N 상태값처럼 값 종류가 매우 적은 컬럼은 단독 인덱스로 기대 효과가 낮을 수 있습니다.
1) 인덱스는 많을수록 좋다?
아닙니다. 많을수록 관리 비용도 커집니다.
2) 인덱스만 걸면 무조건 빨라진다?
아닙니다. 쿼리 형태와 데이터 분포에 따라 효과가 다릅니다.
3) 작은 테이블에도 꼭 필요하다?
항상 그런 것은 아닙니다. 데이터 양이 적으면 전체 조회가 더 빠를 수도 있습니다.
4) 인덱스가 있으면 DB가 항상 그 인덱스를 쓴다?
아닙니다. 옵티마이저가 비용을 계산해서 다른 실행 계획을 선택할 수도 있습니다.
실무에서는 보통 이런 순서로 접근합니다.
- 느린 쿼리를 먼저 찾는다
- 어떤 컬럼으로 자주 조회하는지 본다
- 실행 계획을 확인한다
- 필요한 컬럼에 인덱스를 검토한다
- 쓰기 성능 영향도 같이 본다
즉, 인덱스는 미리 무작정 많이 거는 것보다 실제 쿼리 패턴을 기준으로 설계하는 것이 중요합니다.
초보 단계에서는 우선 이렇게 기억하면 충분합니다.
인덱스는 검색을 빠르게 하는 길잡이이고, 대신 쓰기 비용을 조금 더 내는 구조입니다.
'IT > SQL·DB' 카테고리의 다른 글
| 인덱스를 걸었는데도 느린 이유 7가지 | 실무에서 자주 틀리는 포인트 (0) | 2026.03.25 |
|---|---|
| 트랜잭션(Transaction)이란? ACID와 격리수준까지 쉽게 이해하기 (0) | 2026.03.25 |
| 실행계획(Execution Plan) 보는 방법, 느린 쿼리 잡는 핵심 (0) | 2026.03.25 |
| 데이터베이스 정규화 vs 반정규화, 언제 써야 할까? (0) | 2026.03.25 |
| 데이터베이스 Key 종류 총정리, 기본키·외래키·후보키·슈퍼키 쉽게 이해하기 (0) | 2026.03.25 |

