LumoMate
LumoMate/용어집/SedimentData

인덱스

인덱스(Index)는 데이터베이스에서 검색을 빠르게 하기 위해, 특정 컬럼 값을 미리 정렬·구조화해 둔 보조 자료구조입니다. 책의 색인과 같은 역할을 합니다.
인덱스의 개념을 표현한 편집형 일러스트.

쉬운 설명

수백만 행짜리 표에서 '이메일이 abc@example.com인 사용자'를 찾는 일은, 인덱스가 없으면 한 행씩 처음부터 끝까지 다 살펴봐야 합니다(풀 스캔). 인덱스를 만들어 두면 책 뒤 색인을 보듯 즉시 해당 위치로 점프해 찾을 수 있습니다.

내부적으로는 B-Tree(균형 트리), 해시, 비트맵 같은 자료구조가 쓰입니다. 가장 흔한 B-Tree 인덱스는 '값과 그 값이 있는 행 위치'를 트리 모양으로 정렬해 둡니다. 범위 검색('나이 30~40 사이'), 정렬, 부분 매칭에 두루 강해 대부분의 RDBMS의 기본 선택지입니다.

빠른 검색의 대가로 두 가지를 지불합니다. ① 저장 공간이 더 듭니다(인덱스는 별도 데이터). ② 데이터를 쓰거나 수정할 때 인덱스도 함께 갱신해야 해서 쓰기가 약간 느려집니다. 그래서 모든 컬럼에 인덱스를 거는 건 오히려 손해입니다. '자주 검색·정렬하는 컬럼'에 선별적으로 거는 게 원칙입니다.

자주 막히는 부분: 인덱스가 있다고 무조건 빨라지는 게 아닙니다. WHERE 절이 함수로 컬럼을 감싸거나(예: WHERE LOWER(email) = ...), LIKE '%검색어'처럼 와일드카드가 앞에 오면 인덱스가 쓰이지 못합니다. 또 데이터의 종류 수가 적은 컬럼(예: '성별')에 인덱스를 걸면 거의 효과가 없습니다. 쿼리 플랜(EXPLAIN)을 보고 인덱스가 실제로 동작하는지 확인하는 습관이 필요합니다.

최근 흐름: 단순한 단일 컬럼 인덱스를 넘어 복합 인덱스(여러 컬럼을 한 인덱스로), 부분 인덱스(특정 조건의 행만), 함수 기반 인덱스(LOWER(email) 같은 표현식에 직접 인덱스)가 흔합니다. 또 검색·텍스트 분석에는 전문(full-text) 인덱스나 별도의 검색 엔진(Elasticsearch·Meilisearch)을 함께 씁니다.

인덱스의 개념을 본문 안에서 다른 각도로 비춰 보는 편집형 일러스트.
FIG. 1인덱스를 다른 각도에서 다시 봅니다.

비유로 보면

인덱스는 두꺼운 책 뒤에 붙은 색인과 같습니다. 색인이 없으면 '강아지'라는 단어를 찾기 위해 첫 페이지부터 끝까지 다 봐야 하지만, 색인이 있으면 'ㄱ' 항목에서 즉시 페이지로 점프할 수 있습니다. 색인이 두꺼울수록 책 자체가 두꺼워지지만, 찾기는 즉시 빨라집니다.

어디에서 만나나

모든 관계형 DB(PostgreSQL·MySQL·Oracle·SQL Server)의 기본 도구. NoSQL(MongoDB·Cassandra)에도 비슷한 기능이 있습니다. 검색·이메일 조회·정렬이 잦은 모든 테이블에 인덱스가 깔립니다. 검색 엔진은 인덱스를 더 정교하게 다루는 별도 시스템이라고 볼 수 있습니다.

작은 예시

회원 1천만 명짜리 테이블에서 'username = 'kim'인 회원을 찾는' 쿼리가 인덱스 없이는 3초, username에 인덱스를 만든 뒤로는 5ms 안에 끝납니다. 같은 로직, 같은 데이터인데 응답 시간이 600배 차이 납니다.

자주 하는 오해

오해
흔한 오해 셋. ① '인덱스 많을수록 좋다' — 쓰기 성능이 떨어지고 저장 공간도 늘어납니다. ② '인덱스가 있으면 모든 쿼리가 빠르다' — 쿼리 형태가 인덱스를 못 쓰면 효과가 없습니다. ③ '인덱스는 한 번 만들면 끝' — 데이터 분포·쿼리 패턴이 바뀌면 인덱스 전략도 같이 바뀌어야 합니다.

한 줄 정리

인덱스는 '책의 색인'입니다. 많이 만든다고 책이 좋아지지는 않습니다. 자주 찾는 단어만 잘 정리된 색인이 가장 유용합니다.
매주 월요일 오전 8시

한 주에 한 통,
오래 남는 이해를 보냅니다.

흘려보내지 않는 글만 골라 보내드립니다. 광고와 추적, 외부로 빠지는 미끼 링크 없이 메일 안에서 끝나는 한 통입니다.

언제든 한 번의 클릭으로 해지할 수 있습니다. 스팸은 보내지 않습니다.