[DB 인덱스 개념 정리] B+Tree, 클러스터드 인덱스, 카디널리티, 커버링 인덱스, 디스크와 메모리

2025. 7. 27. 11:28·공부일기../DataBase

인덱스를 이해하려면 B+Tree 구조, 디스크와 메모리 차이, 카디널리티, 커버링 인덱스 등의 개념이 반드시 필요하다.
이번 포스팅은 "인덱스가 실제 데이터를 저장하지 않고 PK만 저장한다는 말의 진짜 의미"부터 시작해 하나씩 차근히 정리해보려 한다.


1. 디스크 vs 메모리 – 왜 이걸 알아야 할까?

DB 성능을 이해하려면 가장 먼저 디스크와 메모리의 차이를 이해해야 한다.

항목 메모리(RAM) 디스크(HDD/SSD)

역할 계산 중인 데이터를 임시 저장 데이터를 영구 보관
속도 매우 빠름 (나노~마이크로초) 상대적으로 느림 (밀리초)
전원 종료 시 모두 사라짐 그대로 유지됨
DB에서 쿼리 캐시, 버퍼 풀 실제 테이블/인덱스 파일 저장

📌 즉, 디스크 접근은 느리기 때문에 최대한 적게 하도록 하는 게 쿼리 최적화의 핵심!


2. 비트리(B-Tree)와 B+Tree

✅ B-Tree란?

정렬된 데이터를 빠르게 탐색할 수 있도록 고안된 균형 잡힌 트리 구조
중간 값을 기준으로 계속 범위를 좁혀나가며 원하는 데이터를 찾는다.

✅ B+Tree는 뭐가 달라?

구분 B-Tree B+Tree
데이터 저장 위치 내부 + 리프 노드 리프 노드에만 저장
리프 노드 연결 안 됨 리프끼리 연결됨 (범위 조회 빠름)
InnoDB에서 사용? ❌ ✅ (MySQL InnoDB는 B+Tree 사용)

3. 클러스터드 인덱스 vs 보조 인덱스

✅ 클러스터드 인덱스 (Clustered Index)

  • PK(Primary Key) 기준으로 테이블 자체가 정렬되어 저장됨
  • 인덱스를 타면 곧바로 실제 데이터 행에 접근 가능
SELECT * FROM product WHERE id = 10;

id가 PK라면 인덱스로 바로 데이터 찾아감


✅ 보조 인덱스 (Secondary Index)

  • name, email 등 PK 외 컬럼에 대한 인덱스
  • 인덱스에는 컬럼 값 + PK만 저장됨
  • 값을 찾은 후 PK로 다시 본 테이블에서 데이터 조회 (row lookup)
SELECT price FROM product WHERE name = 'Shirt';

name 인덱스 → id(PK) 조회 → 다시 본 테이블에서 가격 조회


4. 카디널리티(Cardinality)

특정 컬럼에 서로 다른 값이 얼마나 다양한가?

예시 카디널리티
성별 (남/여) 낮음
사용자 ID (모두 다름) 높음

 

✅ 카디널리티가 높을수록 인덱스 효율이 좋다.


5. 커버링 인덱스(Covering Index)

SELECT 대상의 모든 컬럼이 인덱스에 포함되어 있을 때
→ 테이블 접근 없이 인덱스에서 바로 조회 가능

-- 모든 컬럼이 인덱스에 포함됨
CREATE INDEX idx_product_name_price ON product(name, price);

SELECT price FROM product WHERE name = 'Shirt';

✅ 테이블 접근 안 해도 되므로 조회 성능 매우 좋음
❌ SELECT *처럼 모든 컬럼 다 조회하면 커버링 인덱스 적용 불가


6. 리터럴(Literal)

쿼리 안에서 고정된 값 그 자체

WHERE price > 1000        -- ✅ 1000은 리터럴
WHERE name = 'Shirt'      -- ✅ 'Shirt'도 리터럴

❌ 연산이 컬럼 쪽에 들어가면 인덱스 못 쓴다

WHERE price * 2 > 2000    -- ❌ price 컬럼을 가공하면 인덱스 미적용

7. 트레이드오프(Trade-off)

어떤 걸 얻으면 다른 걸 포기해야 하는 구조

예시:

선택 장점 단점
정규화 중복 제거, 정합성↑ 조회 쿼리 복잡, JOIN 많아짐
반정규화 조회 빠름 데이터 중복, UPDATE 복잡

🔚 마무리 정리

  • 디스크는 느리니까 인덱스를 잘 만들어서 접근 횟수를 줄여야 한다.
  • 인덱스는 B+Tree 구조로 만들어져 있고,
  • 보조 인덱스는 실제 데이터를 갖고 있지 않고 PK만 갖는다.
  • 카디널리티, 커버링 인덱스, 리터럴 위치, 트레이드오프 모두 인덱스 성능에 직결되는 개념이다.

 

 

'공부일기.. > DataBase' 카테고리의 다른 글

[mySql 인덱스 설계] 기본원칙, 설계방법 , 주의사항!!!  (3) 2025.07.28
[인덱스 용어정리] 클러스터 인덱스 ,보조인덱스, 단일 인덱스,복합 인덱스, 커버링 인덱스  (1) 2025.07.27
[ERD] 이커머스 ERD 설계 과정: 정규화, 관계 설계, 제약 조건  (1) 2025.07.18
[MySql] 컬럼 일련번호 자동 증가 AUTO_INCREMENT  (0) 2025.06.20
[DBeaver] MySQL 연결 시 "Unknown database '데이터베이스이름' " 해결하기 / Database 이름 찾기/생성하기 - MacOS  (0) 2025.06.20
'공부일기../DataBase' 카테고리의 다른 글
  • [mySql 인덱스 설계] 기본원칙, 설계방법 , 주의사항!!!
  • [인덱스 용어정리] 클러스터 인덱스 ,보조인덱스, 단일 인덱스,복합 인덱스, 커버링 인덱스
  • [ERD] 이커머스 ERD 설계 과정: 정규화, 관계 설계, 제약 조건
  • [MySql] 컬럼 일련번호 자동 증가 AUTO_INCREMENT
s0-0mzzang
s0-0mzzang
공부한것을 기록합니다...
  • s0-0mzzang
    승민이의..개발일기..🐰
    s0-0mzzang
  • 전체
    오늘
    어제
    • 전체~ (108)
      • 마음가짐..! (10)
      • 공부일기.. (76)
        • weekly-log (6)
        • Spring (19)
        • Java (18)
        • DataBase (10)
        • git (2)
        • JPA (6)
        • kafka (1)
        • Backend Architecture (3)
        • Troubleshooting (삽질..ㅋ) (2)
        • Cloud (1)
        • Docker (2)
        • 알고리즘 (1)
        • 리액트 (2)
        • Infra (3)
      • 하루일기.. (22)
        • 그림일기 (8)
        • 생각일기 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    SpringBoot
    TDD
    항해플러스
    ADC 환경
    스프링부트
    BufferedReader
    항해99
    React
    MySQL
    Paging
    자바
    spring
    다짐
    인프라 기초
    spring boot
    ERD
    StringTokenizer
    리팩토링
    swagger
    JPA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s0-0mzzang
[DB 인덱스 개념 정리] B+Tree, 클러스터드 인덱스, 카디널리티, 커버링 인덱스, 디스크와 메모리
상단으로

티스토리툴바