B-트리 인덱스와 그 효과
인덱스에 실제로 저장되는 내용과 인덱스가 빠르게 처리하는 연산을 알아봅니다.
B-트리 인덱스와 그 효과은(는) CoddyKit의 무료 Coding Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Coding Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
면접관이 인덱스에 관해 묻는 이유
면접관이 ‘이 질의가 느린데, 어떻게 하시겠습니까?’라고 물으면, 거의 항상 인덱스와 관련된 답변을 기대합니다. 인덱스는 읽기 성능을 개선하는 가장 큰 수단이므로, 문법을 외운 지원자와 데이터베이스가 실제로 행을 찾는 방식을 이해하는 지원자를 구분할 수 있습니다.
이 레슨에서는 B-트리 인덱스에 대한 정확한 개념 모델을 익힙니다. 무엇을 저장하고, 어떤 작업을 빠르게 하며, 숙련된 엔지니어처럼 이를 설명하는 방법을 알아봅니다.
인덱스가 해결하는 문제
인덱스가 없으면 조건에 맞는 행을 찾기 위해 데이터베이스가 테이블의 모든 행을 읽어야 합니다. 이를 순차 스캔(또는 전체 테이블 스캔)이라고 합니다. 백만 행이 있는 테이블에서 행 하나만 일치하더라도 백만 개의 행을 검사해야 한다는 뜻입니다.
인덱스는 별도의 정렬된 데이터 구조입니다. 책의 색인이 모든 페이지를 읽지 않고도 주제를 찾게 해 주는 것처럼, 데이터베이스 엔진이 일치하는 행으로 바로 이동할 수 있게 해 줍니다.
-- No index: the engine reads ALL rows to find this one
SELECT * FROM users WHERE email = 'ada@example.com';B-트리가 실제로 저장하는 것
PostgreSQL, MySQL, SQL 서버 및 대부분의 엔진에서 기본으로 사용하는 인덱스는 B-트리(균형 트리)입니다. 인덱싱된 열의 값을 정렬된 순서로 저장하고, 이를 페이지로 구성된 얕은 트리로 관리합니다.
- 각 리프 노드는 인덱스 키와 실제 테이블 행을 가리키는 포인터를 저장합니다.
- 트리는 균형을 유지하므로 테이블 크기와 관계없이 어떤 조회도 몇 개의 페이지만 접근하면 됩니다.
조회는 모든 N개 행을 스캔하는 대신 루트에서 리프까지 내려가며 대략 log(N)단계를 거칩니다.
첫 인덱스 만들기
CREATE INDEX를 사용하여 B-트리 인덱스를 만듭니다. 검토자가 테이블과 열을 한눈에 알 수 있도록 이름을 명확하게 지정하십시오.
이 인덱스가 있으면 email로 필터링하는 질의가 전체 스캔을 수행하는 대신 몇 번의 페이지 읽기만으로 일치하는 행을 찾을 수 있습니다.
CREATE INDEX idx_users_email ON users (email);
-- Now this lookup uses the index instead of scanning
SELECT * FROM users WHERE email = 'ada@example.com';B-트리가 빠르게 처리하는 작업
B-트리는 값을 정렬된 상태로 유지하므로 정확히 일치하는 값을 찾는 작업보다 훨씬 다양한 작업을 빠르게 처리합니다. 면접관은 다음 항목을 정확하게 나열하는 답변을 특히 높이 평가합니다.
- 동등 비교:
WHERE email = ? - 범위:
WHERE age > 30,BETWEEN,<,>= - 접두사 일치:
WHERE name LIKE 'Ada%'(단, NOT'%da') - 인덱싱된 열에 대한 ORDER BY로 별도의 정렬을 피하는 작업
- 정렬된 구조의 양 끝에 위치하므로 가능한 MIN/MAX
예제로 살펴보기: 범위 질의
수백만 개의 행이 있는 주문 테이블을 생각해 보십시오. 보고서용 질의가 최근 주문을 요청합니다. created_at에 인덱스가 있으면 엔진은 정렬된 인덱스에서 범위의 시작점으로 이동한 다음 필요한 만큼만 앞으로 탐색합니다.
인덱스는 전체 테이블 스캔을 제한된 범위 스캔으로 바꾸어 조건에 맞는 부분만 읽게 합니다.
CREATE INDEX idx_orders_created_at ON orders (created_at);
SELECT order_id, total
FROM orders
WHERE created_at >= '2026-01-01'
AND created_at < '2026-02-01';인덱스는 정렬도 도와줍니다
자주 놓치는 점이 하나 있습니다. 인덱스는 이미 정렬되어 있으므로 엔진이 인덱스 순서대로 행을 반환하여 별도의 정렬 단계를 건너뛸 수 있습니다. 이는 ORDER BY에 중요하며, 특히 상위 N개 결과의 페이지 나누기에서 중요합니다.
일치하는 인덱스가 있는 열로 정렬하면 최적화기가 인덱스를 순서대로 읽고 충분한 행을 얻는 즉시 일찍 중단할 수 있습니다.
-- Index on created_at lets this avoid a sort and stop after 10 rows
SELECT order_id, total
FROM orders
ORDER BY created_at DESC
LIMIT 10;숨은 비용: 힙 조회
일반적인 B-트리 인덱스에는 인덱싱된 열과 행 포인터만 저장됩니다. 따라서 일치하는 항목을 찾은 뒤에도 엔진은 선택한 다른 열을 읽기 위해 테이블(힙)으로 이동해야 합니다.
이 두 번째 이동이 힙 조회입니다. 몇 개의 행만 조회할 때는 저렴하지만 많은 행이 일치하는 질의에서는 비용이 커집니다. 이것이 선택도가 낮은 인덱스를 무시하는 경우가 있는 이유 중 하나입니다. (뒤에서 포괄 인덱스가 이 문제를 해결하는 방법을 살펴봅니다.)
인덱스가 사용되는지 확인하기
인덱스가 사용되었다고 주장하지 말고 EXPLAIN으로 입증하십시오. 면접에서 실행 계획을 설명하면 실제 이해도를 보여줄 수 있습니다.
Seq Scan은 인덱스가 사용되지 않았다는(NOT) 뜻입니다.Index Scan또는Index Seek이면 인덱스가 사용된 것입니다.
인덱스를 추가했는데도 순차 스캔이 계속 표시된다면, 플래너가 스캔이 더 저렴하다고 판단한 것입니다. 이는 대개 질의가 테이블에서 너무 많은 비율의 행과 일치하기 때문입니다.
EXPLAIN
SELECT * FROM users WHERE email = 'ada@example.com';
-- Look for: Index Scan using idx_users_emailPRIMARY KEY는 이미 인덱싱되어 있습니다
면접에서 자주 나오는 함정이 있습니다. PRIMARY KEY 또는 UNIQUE 제약 조건을 선언하면 지원하는 B-트리 인덱스가 자동으로 생성됩니다. 같은 열에 두 번째 인덱스를 추가할 필요도, 추가해서도 안 됩니다.
따라서 기본 키를 사용한 조인과 조회는 이미 빠르며, ‘식별자 열에 인덱스를 추가해야 할까요?’라는 질문은 대개 함정입니다. 이미 자동으로 처리되어 있기 때문입니다.
-- This already builds a unique B-Tree index on (id)
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email TEXT UNIQUE
);면접에서 설명하는 방법
면접관이 고개를 끄덕일 수 있도록 다음과 같이 깔끔한 한 문장으로 정리해 보십시오.
‘B-트리 인덱스는 정렬되고 균형 잡힌 구조이므로 전체 테이블을 스캔하는 대신 log(N)번의 페이지 읽기로 엔진이 행을 찾게 해 줍니다. 인덱싱된 열에 대한 동등 비교, 범위, 접두사 및 ORDER BY 작업을 빠르게 처리하지만, 일치하는 각 행은 인덱스에 없는 열을 읽기 위해 여전히 힙 조회를 필요로 합니다.’
그런 다음 EXPLAIN으로 뒷받침하십시오. 개념 모델과 근거를 함께 제시하는 것이 점수를 얻는 답변입니다.
빠른 점검
B-트리 인덱스가 어떤 작업을 빠르게 처리하는지에 대한 개념 모델을 점검해 보십시오.
요약: B-트리 인덱스
다음 레슨으로 가져갈 핵심 내용입니다.
- B-트리는 인덱싱된 값을 균형 트리에서 정렬된 상태로 저장하므로
log(N)조회가 가능합니다. - 동등 비교, 범위, 접두사(선행) LIKE, ORDER BY 및 MIN/MAX 작업을 빠르게 처리합니다.
- 각 일치 항목은 인덱스에 없는 열을 읽기 위해 여전히 힙 조회가 필요합니다.
- 열을 함수로 감싸거나 선행 와일드카드를 사용하면 인덱스가 비활성화됩니다.
- 항상
EXPLAIN으로 확인하십시오. PRIMARY KEY와 UNIQUE 제약 조건은 자동으로 인덱스를 생성합니다.
다음 주제에서는 하나의 인덱스가 여러 열을 포함할 때 열 순서를 정하는 방법을 알아봅니다.
자주 묻는 질문
“B-트리 인덱스와 그 효과” 강의는 무료인가요?
네 — “B-트리 인덱스와 그 효과” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Coding Interview Prep 강의 전체를 잠금 해제할 수 있습니다. Coding Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“B-트리 인덱스와 그 효과”에서 뭘 배우나요?
인덱스에 실제로 저장되는 내용과 인덱스가 빠르게 처리하는 연산을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 Coding Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Coding Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Coding Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“B-트리 인덱스와 그 효과” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Coding Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Coding Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- B-트리 인덱스와 그 효과
- 복합 인덱스 열 순서
- 커버링 인덱스와 인덱스 전용 스캔
- 인덱스가 해가 되는 경우: 쓰기와 선택도