데이터베이스에서 인덱스(Index)는 어떻게 작동할까?
데이터베이스에서 데이터를 다루다 보면, 어느 순간부터 조회 속도가 점점 느려지는 걸 체감하게 된다. 단 몇 개의 데이터일 땐 문제가 없었는데, 수천~수백만 건이 넘어가면 SELECT
한 줄에도 시간이 오래 걸릴 수 있다. 이 문제를 해결하기 위해 등장한 기술이 바로 인덱스(Index) 이다.
이 글에서는 인덱스가 무엇인지, 왜 필요한지, 내부적으로 어떤 방식으로 동작하는지에 대해 간단히 정리해보고자 한다.
인덱스(Index)란?
인덱스는 쉽게 말하면 책의 목차와 같다. 책에서 '자료구조'라는 키워드를 찾고 싶을 때, 책의 첫 장부터 모든 페이지를 다 넘기진 않는다. 대신 맨 앞에 있는 목차나 맨 뒤의 색인을 참고해 해당 키워드가 몇 페이지에 있는지 확인하고, 바로 그 페이지로 이동한다.
데이터베이스에서도 마찬가지다. 테이블 안에 수많은 행(레코드)이 있을 때, 특정 조건에 맞는 값을 찾기 위해 모든 행을 처음부터 끝까지 스캔(full scan) 하는 것은 너무 느리고 비효율적이다. 그래서 인덱스를 사용하면 마치 '색인'처럼 찾고자 하는 값의 위치를 미리 알고 빠르게 접근할 수 있게 된다.
인덱스는 어떻게 작동할까?
데이터베이스 인덱스는 내부적으로 대부분 트리 구조, 특히 B-Tree(Balanced Tree) 를 기반으로 만들어진다. 이 구조는 데이터가 정렬된 형태로 저장되며, 이진 탐색이 가능하기 때문에 검색 속도가 빠르다.
예를 들어 WHERE name = '홍길동'
이라는 조건이 있다고 해보자. 만약 name
컬럼에 인덱스가 없다면, DB는 모든 행을 일일이 확인해 '홍길동'을 찾는다. 반면 인덱스가 존재하면, 인덱스 트리에서 '홍길동'이라는 키 값을 먼저 찾고, 그 키에 해당하는 실제 데이터 주소(Row ID 또는 Tuple ID)를 통해 바로 결과를 가져온다.
여기서 중요한 건 인덱스는 실제 데이터가 아니라, 특정 컬럼 값과 해당 행의 위치 정보를 따로 저장해 둔 자료구조라는 점이다. 인덱스를 만들어두면 검색 속도가 빨라지지만, 반대로 데이터를 추가하거나 수정할 때마다 인덱스를 함께 갱신해야 하므로 쓰기 성능이 느려질 수 있다.
언제 인덱스를 사용해야 할까?
인덱스는 다음과 같은 경우에 특히 유용하다.
WHERE
,ORDER BY
,GROUP BY
,JOIN
조건에 자주 사용되는 컬럼- 데이터 양이 많고, 조회 속도가 중요한 상황
- 자주 검색하지만 자주 수정되지는 않는 테이블
하지만 모든 컬럼에 인덱스를 남발하면 오히려 성능이 더 나빠질 수도 있다. 인덱스는 선택적으로, 전략적으로 설정해야 한다.
마무리
공부한 내용을 저만의 방식으로 정리한 글입니다. 따라서 틀린 내용이 있을 수도 있으니 공식 문서나 DBMS 레퍼런스를 함께 참고하시는 걸 추천드립니다. 또한 잘못된 내용이 있다면 지적해주시면 감사하겠습니다.
'Computer Science Basics' 카테고리의 다른 글
Percaptron(퍼셉트론)에서 딥러닝까지: 인공신경망의 구조적 기초 (0) | 2025.04.29 |
---|