Home > DB > πŸ’Ύ[Database] Clustered IndexλŠ” λ¬΄μ—‡μΌκΉŒμš”?

πŸ’Ύ[Database] Clustered IndexλŠ” λ¬΄μ—‡μΌκΉŒμš”?
Database Native SQL Query MySQL

β€œπŸ’Ύ[Database] Clustered IndexλŠ” λ¬΄μ—‡μΌκΉŒμš”?”

🍎 Intro.

  • Clusterd IndexλŠ” λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ—μ„œ 데이터가 물리적으둜 μ •λ ¬λœ λ°©μ‹μœΌλ‘œ μ €μž₯λ˜λŠ” μΈλ±μŠ€μž…λ‹ˆλ‹€.
    • 이 인덱슀λ₯Ό μ‚¬μš©ν•˜λ©΄ μΈλ±μŠ€κ°€ κ³§ 데이터이며, 인덱슀λ₯Ό μ‘°νšŒν•  λ•Œ λ³„λ„λ‘œ 데이터λ₯Ό μ°Ύμ•„κ°€λŠ” 과정이 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

βœ…1️⃣ Clustered Index의 νŠΉμ§•.

  • 1. μΈλ±μŠ€μ™€ 데이터가 동일
    • ν΄λŸ¬μŠ€ν„°ν˜• μΈλ±μŠ€λŠ” ν…Œμ΄λΈ”μ˜ ν–‰(ROW) 자체λ₯Ό μ •λ ¬λœ μƒνƒœλ‘œ μ €μž₯ν•©λ‹ˆλ‹€.
      • 즉, 인덱슀의 ν‚€ 값이 λ°μ΄ν„°μ˜ μ €μž₯ μˆœμ„œλ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.
    • ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ—λŠ” ν•˜λ‚˜μ˜ ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀만 μ‘΄μž¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 2. 데이터가 μ •λ ¬λ˜μ–΄ μ €μž₯
    • λ°μ΄ν„°λŠ” ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀의 ν‚€ κ°’ μˆœμ„œλŒ€λ‘œ 물리적으둜 μ •λ ¬λ©λ‹ˆλ‹€.
      • 예: PRIMARY KEYλ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬λœ ν…Œμ΄λΈ”.
  • 3. λΉ λ₯Έ 검색
    • ν΄λŸ¬μŠ€ν„°ν˜• μΈλ±μŠ€λŠ” 데이터가 이미 μ •λ ¬λ˜μ–΄ μžˆμœΌλ―€λ‘œ λ²”μœ„ κ²€μƒ‰μ΄λ‚˜ μ •λ ¬ μΏΌλ¦¬μ—μ„œ μ„±λŠ μ΄ 맀우 λ›°μ–΄λ‚©λ‹ˆλ‹€.
  • 4. μ‚½μž…/μ‚­μ œ μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯μ„±
    • 데이터가 μ •λ ¬λœ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•˜λ―€λ‘œ, μ‚½μž…/μ‚­μ œ μ‹œ μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€(특히 쀑간에 μ‚½μž…ν•  경우).

βœ…2️⃣ Clustered Index의 μ‹€μ œ 예제

1️⃣ 예제: PRIMARY KEY둜 μƒμ„±λœ ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀.

  • MySQLμ—μ„œ 기본적으둜 κΈ°λ³Έ ν‚€(Primary Key)λŠ” ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀둜 μƒμ„±λ©λ‹ˆλ‹€.
CREATE TABLE article (
    article_id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    created_at DATETIME
);
  • κ²°κ³Ό :
    • article_idλ₯Ό κΈ°μ€€μœΌλ‘œ 데이터가 μ •λ ¬λœ μƒνƒœλ‘œ μ €μž₯λ©λ‹ˆλ‹€.
    • PRIMARY KEYκ°€ ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀 역할을 ν•©λ‹ˆλ‹€.

2️⃣ 예제: UNIQUEλ₯Ό κΈ°μ€€μœΌλ‘œ ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀 생성.

  • MySQLμ—μ„œλŠ” νŠΉμ • 열을 κΈ°μ€€μœΌλ‘œ ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀λ₯Ό 생성할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
CREATE TABLE user (
    user_id INT AUTO_INCREMENT,
    username VARCHAR(255) UNIQUE,
    email VARCHAR(255),
    PRAIMARY KEY (user_id),
    UNIQUE KEY idx_username (username)
);
  • κ²°κ³Ό:
    • PRIMARY KEY(user_id)κ°€ ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀둜 μ‚¬μš©λ©λ‹ˆλ‹€.
    • username은 μ •λ ¬λ˜μ§€ μ•Šκ³ , λ³„λ„μ˜ λΉ„ν΄λŸ¬μŠ€ν„°ν˜•(Non-Clustered) 인덱슀둜 μ €μž₯λ©λ‹ˆλ‹€.

βœ…3️⃣ Clustered Index의 μž₯점.

  • 1. λΉ λ₯Έ 검색:
    • 데이터가 인덱슀 ν‚€ κ°’μœΌλ‘œ μ •λ ¬λ˜μ–΄ μžˆμœΌλ―€λ‘œ, λ²”μœ„ 검색(예: BETWEEN, ORDER BY)μ—μ„œ λΉ λ₯Έ μ„±λŠ₯ 제곡.
  • 2. 데이터 μ ‘κ·Ό μ΅œμ†Œν™”:
    • μΈλ±μŠ€κ°€ κ³§ λ°μ΄ν„°μ΄λ―€λ‘œ, λ³„λ„μ˜ 포인터λ₯Ό 따라가지 μ•Šμ•„λ„ 됨.
  • 3. 효율적인 μ €μž₯ 곡간:
    • 데이터와 μΈλ±μŠ€κ°€ κ²°ν•©λ˜μ–΄ λ³„λ„μ˜ 인덱슀 μ €μž₯ 곡간이 ν•„μš” μ—†μŒ.

βœ…4️⃣ Clustered Index의 단점.

  • 1. μ‚½μž…/μ‚­μ œ μ„±λŠ₯ μ €ν•˜:
    • 데이터가 항상 μ •λ ¬λœ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•˜λ―€λ‘œ, 쀑간에 μ‚½μž…ν•˜κ±°λ‚˜ μ‚­μ œν•  경우 좔가적인 λΉ„μš© λ°œμƒ.
  • 2. μ—…λ°μ΄νŠΈ μ„±λŠ₯ 문제:
    • ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀 ν‚€ 값이 λ³€κ²½λ˜λ©΄ λ°μ΄ν„°μ˜ 물리적 μž¬λ°°μ—΄μ΄ ν•„μš”ν•  수 있음.
  • 3. ν•˜λ‚˜λ§Œ 생성 κ°€λŠ₯:
    • ν•œ ν…Œμ΄λΈ”μ— ν•˜λ‚˜μ˜ ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀만 ν—ˆμš©λ˜λ―€λ‘œ, μ—¬λŸ¬ μ •λ ¬ 기쀀이 ν•„μš”ν•˜λ©΄ λΉ„ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀λ₯Ό μ‚¬μš©ν•΄μ•Ό 함.

βœ…5️⃣ Clustered Indexκ°€ μ ν•©ν•œ 경우.

  • 1. λ²”μœ„ 검색이 λΉˆλ²ˆν•œ 경우:
    • μ˜ˆμ‹œ:
        SELECT *
        FROM orders
        WHERE order_date
        BETWEEN '2025-01-01' AND '2025-01-31';
      
  • 2. μ •λ ¬λœ κ²°κ³Όκ°€ ν•„μš”ν•œ 경우:
    • μ˜ˆμ‹œ:
        SELECT *
        FROM article
        ORDER BY created_at DESC;
      
  • 3. 데이터 읽기가 λ§Žμ€ 경우:
    • 데이터 읽기 μ„±λŠ₯이 μ€‘μš”ν•  λ•Œ ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀λ₯Ό ν™œμš©ν•˜λ©΄ 효율적.

πŸš€ 정리.

  • Clustered IndexλŠ” 데이터가 인덱슀 ν‚€ κ°’ μˆœμ„œλŒ€λ‘œ μ •λ ¬λœ μƒνƒœλ‘œ μ €μž₯λ˜λŠ” μΈλ±μŠ€μž…λ‹ˆλ‹€.
  • μž₯점 : λ²”μœ„ 검색과 μ •λ ¬ μΏΌλ¦¬μ—μ„œ 맀우 효율적.
  • 단점 : μ‚½μž…/μ‚­μ œ μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯, ν•œ ν…Œμ΄λΈ”μ—μ„œ ν•˜λ‚˜λ§Œ 생성 κ°€λŠ₯.
  • MySQLμ—μ„œλŠ” PRIMARY KEYκ°€ 기본적으둜 ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀둜 μ‚¬μš©λ©λ‹ˆλ‹€.