인덱스란 무엇인가
인덱스(Index)는 테이블에 저장된 데이터를 빠르게 찾기 위해 만들어 놓은 별도의 자료구조입니다. 책 뒤편에 있는 ‘찾아보기’ 페이지를 떠올리면 이해하기 쉽습니다. 두꺼운 전공 서적에서 특정 키워드를 찾으려면 처음부터 끝까지 페이지를 넘겨볼 수도 있지만, 찾아보기 페이지에서 키워드와 페이지 번호를 확인하면 바로 원하는 곳으로 이동할 수 있죠. 데이터베이스 인덱스도 이와 같은 역할을 합니다. WHERE 절이나 JOIN 조건에 사용되는 컬럼에 인덱스를 만들어두면, 전체 테이블을 다 뒤지지 않고도 원하는 행을 빠르게 찾아낼 수 있습니다.
인덱스가 빠른 이유: B-Tree 구조
인덱스가 없는 테이블에서 특정 값을 찾으려면 첫 행부터 마지막 행까지 순차적으로 읽는 ‘풀 스캔(Full Scan)’이 발생합니다. 데이터가 100만 건이라면 최악의 경우 100만 번을 비교해야 하죠. 반면 대부분의 데이터베이스는 인덱스를 B-Tree(균형 트리)라는 구조로 저장합니다. B-Tree는 데이터를 정렬된 상태로 트리 형태에 나눠 담아두는데, 루트 노드에서 시작해 값의 크기를 비교하며 좌우로 가지를 타고 내려가면 원하는 데이터에 훨씬 적은 비교 횟수로 도달할 수 있습니다.
예를 들어 100만 건의 데이터를 풀 스캔하면 최악의 경우 100만 번 비교가 필요하지만, B-Tree 인덱스를 사용하면 트리의 높이만큼만 비교하면 되므로 보통 20번 안팎의 비교로 원하는 행을 찾을 수 있습니다. 이는 사전에서 단어를 찾을 때 첫 페이지부터 넘기지 않고, 중간을 펼쳐 알파벳 순서를 보며 범위를 좁혀가는 것과 비슷한 원리입니다.
실무에서 인덱스를 쓸 때 고려할 점
인덱스는 조회 속도를 크게 높여주지만 공짜는 아닙니다. 데이터를 추가하거나 수정할 때마다 인덱스 구조도 함께 갱신해야 하므로 INSERT, UPDATE, DELETE 성능은 떨어질 수 있습니다. 또한 인덱스 자체가 저장 공간을 차지하기 때문에 모든 컬럼에 인덱스를 거는 것은 비효율적입니다.
- 조회가 자주 일어나는 컬럼(검색 조건, JOIN 키)에 우선 적용
- 중복이 적고 값이 다양한 컬럼일수록 효과가 큼
- 쓰기가 빈번한 테이블에는 인덱스 개수를 신중히 결정
결국 인덱스는 ‘조회 속도’와 ‘쓰기 비용’ 사이의 트레이드오프이며, 서비스의 쿼리 패턴을 분석해 필요한 곳에만 적절히 적용하는 것이 좋은 데이터베이스 설계의 핵심입니다.