Home > Backend Development > πŸ“š[Backend Development] κ°€μž₯ μ€‘μš”ν•œ 두 가지 인덱슀 μœ ν˜•.

πŸ“š[Backend Development] κ°€μž₯ μ€‘μš”ν•œ 두 가지 인덱슀 μœ ν˜•.
Backend Ddevelopment

β€œπŸ“š[Backend Development] κ°€μž₯ μ€‘μš”ν•œ 두 가지 인덱슀 μœ ν˜•.”

πŸ“ Intro

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ IndexλŠ” 검색 μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” 핡심 μš”μ†Œμž…λ‹ˆλ‹€.
κ·Έ μ€‘μ—μ„œ Clustered Index(ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀)와 Secondary Index(보쑰 인덱슀, Non-Clustered Index)λŠ” κ°€μž₯ μ€‘μš”ν•œ 두 가지 인덱슀 μœ ν˜•μž…λ‹ˆλ‹€.

βœ…1️⃣ Clustered Index (ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀)

βœ… κ°œλ…

  • ν…Œμ΄λΈ”μ˜ 데이터λ₯Ό 물리적으둜 μ •λ ¬ν•˜λŠ” 인덱슀.
  • ν•œ ν…Œμ΄λΈ”μ— ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•  수 있음.
  • κΈ°λ³Έ ν‚€(Primary Key) 에 μžλ™μœΌλ‘œ 생성됨.
  • 데이터 μžμ²΄κ°€ 인덱슀 트리(B+ Tree) ꡬ쑰둜 μ €μž₯됨.

βœ… νŠΉμ§•

  • βœ… 데이터 μžμ²΄κ°€ μ •λ ¬λœ ν˜•νƒœλ‘œ μ €μž₯됨.
  • βœ… Primary Key(κΈ°λ³Έ ν‚€)에 μžλ™ 생성됨.
  • βœ… λ²”μœ„ 검색(BETWEEN, ORDER BY)이 빠름.
  • βœ… ν…Œμ΄λΈ”λ‹Ή ν•˜λ‚˜λ§Œ 쑴재.

βœ… 예제

CREATE TABLE users (
    id INT PRIMARY KEY, -- μžλ™μœΌλ‘œ Clusterd Index 생성
    name VARCHAR(100),
    age INT
);
  • μœ„ ν…Œμ΄λΈ”μ—μ„œ idλŠ” κΈ°λ³Έ ν‚€(Primary Key) μ΄λ―€λ‘œ μžλ™μœΌλ‘œ Clustered Indexκ°€ μƒμ„±λ©λ‹ˆλ‹€.
  • 즉, ν…Œμ΄λΈ”μ˜ 데이터가 id 값을 κΈ°μ€€μœΌλ‘œ μ •λ ¬λœ μƒνƒœλ‘œ μ €μž₯λ©λ‹ˆλ‹€.

βœ…2️⃣ Secondary Index (보쑰 인덱슀, Non-Clustered Index)

βœ… κ°œλ…

  • Clustered Index와 λ³„κ°œλ‘œ 좔가적인 검색 속도λ₯Ό 높이기 μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 인덱슀.
  • 데이터와 λ³„λ„λ‘œ μ €μž₯되며, Clustered Index의 κ°’(Primary Key)을 μ°Έμ‘°.
  • ν•œ ν…Œμ΄λΈ”μ— μ—¬λŸ¬ 개 생성 κ°€λŠ₯.

βœ… νŠΉμ§•

  • βœ… 데이터 μ •λ ¬μ—λŠ” 영ν–₯을 주지 μ•ŠμŒ
  • βœ… ν…Œμ΄λΈ”λ‹Ή μ—¬λŸ¬ 개 생성 κ°€λŠ₯
  • βœ… Clustered Indexλ₯Ό 기반으둜 좔가적인 검색 속도 ν–₯상
  • βœ… λ²”μœ„ κ²€μƒ‰λ³΄λ‹€λŠ” νŠΉμ • κ°’ 검색(WHERE 쑰건)에 적합

βœ… 예제

CREATE INDEX idx_users_name ON users(name);
  • name μ»¬λŸΌμ— 보쑰 인덱슀(Secondary Index)λ₯Ό μƒμ„±ν•˜μ—¬ 이름 검색 속도λ₯Ό μ΅œμ ν™”.

βœ…3️⃣ Clustered Index vs Secondary Index 비ꡐ

ꡬ뢄 Clustered Index Secondary Index (Non-Clustered Index)
μ •λ ¬ 방식 데이터 μžμ²΄κ°€ 인덱슀 νŠΈλ¦¬μ— 정렬됨 데이터 정렬에 영ν–₯을 주지 μ•ŠμŒ
μ €μž₯ 방식 데이터 μžμ²΄κ°€ 인덱슀 λ…Έλ“œμ— μ €μž₯됨 μΈλ±μŠ€μ— Primary Keyλ₯Ό μ €μž₯ ν›„ 데이터 μ°Έμ‘°
속도 λ²”μœ„ 검색(BETWEEN, ORDER BY) 졜적 νŠΉμ • κ°’ 검색(WHERE) 졜적
개수 ν•œ ν…Œμ΄λΈ”μ— ν•˜λ‚˜λ§Œ 쑴재 μ—¬λŸ¬ 개 쑴재 κ°€λŠ₯
예제 PRIMARY KEY (id) CREATE INDEX idx_name ON users(name)

βœ…4️⃣ Clustered Index & Secondary Index 검색 κ³Όμ •.

πŸ“Œ Clustered Index 검색 κ³Όμ •

SELECT * FROM users WHERE id = 100;
  • Clustered IndexλŠ” 데이터 μžμ²΄κ°€ μ •λ ¬λœ μƒνƒœμ΄λ―€λ‘œ, id = 100을 λ°”λ‘œ 찾을 수 있음.
  • B+ Treeμ—μ„œ ν•œ 번의 κ²€μƒ‰μœΌλ‘œ λ°μ΄ν„°κΉŒμ§€ 도달 β†’ λΉ λ₯Έ 쑰회 속도.

πŸ“Œ Secondary Index 검색 κ³Όμ •

SELECT * FROM users WHERE name = 'Alice';
  • name μ»¬λŸΌμ€ Secondary Indexμ΄λ―€λ‘œ, λ¨Όμ € 보쑰 인덱슀λ₯Ό κ²€μƒ‰ν•œ ν›„, Primary Key 값을 μ°Ύμ•„ Clustered Indexμ—μ„œ 데이터 검색.
  • β€œSecondary Index ➞ Clustered Index” 두 단계 검색 과정이 ν•„μš”ν•˜μ—¬ Clustered Index보닀 속도가 μ•½κ°„ 느림.

βœ…5️⃣ μ–Έμ œ Clustered Index & Secondary Indexλ₯Ό μ‚¬μš©ν•΄μ•Ό ν• κΉŒ?

βœ… Clustered Index μΆ”μ²œ

  • PRIMARY KEY와 같이 데이터 정렬이 μ€‘μš”ν•œ 경우.
  • ORDER BY, BETWEEN, RANGE QUERλ₯Ό 자주 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 경우.

βœ… Secondary Index μΆ”μ²œ

  • νŠΉμ • μ»¬λŸΌμ„ WHERE 쑰건으둜 자주 검색해야 ν•  λ•Œ.
  • JOIN λ˜λŠ” GROUP BY 연산이 λ§Žμ€ 경우.
  • 보쑰적인 검색 속도λ₯Ό 높이고 싢을 λ•Œ.

πŸ“Œ κ²°λ‘ .

  • βœ… Clustered IndexλŠ” 데이터 자체λ₯Ό μ •λ ¬ν•˜μ—¬ μ €μž₯ν•˜λ©°, Primary Key에 μžλ™μœΌλ‘œ 생성됨
  • βœ… Secondary IndexλŠ” 좔가적인 검색 μ΅œμ ν™”λ₯Ό μœ„ν•΄ μ‚¬μš©λ˜λ©°, ν…Œμ΄λΈ”λ‹Ή μ—¬λŸ¬ 개 생성 κ°€λŠ₯
  • βœ… λ²”μœ„ 검색(ORDER BY, BETWEEN)은 Clustered Indexκ°€ 유리
  • βœ… νŠΉμ • 컬럼 검색(WHERE 쑰건)은 Secondary Indexκ°€ 유리.