Home > DB > πŸ’Ύ[Database] Secondary Index(보쑰 인덱슀)λŠ” λ¬΄μ—‡μΌκΉŒμš”?

πŸ’Ύ[Database] Secondary Index(보쑰 인덱슀)λŠ” λ¬΄μ—‡μΌκΉŒμš”?
Database Database Optimization

πŸ’Ύ[Database] Secondary Index(보쑰 인덱슀)λŠ” λ¬΄μ—‡μΌκΉŒμš”?

πŸ“Œ Intro.

  • β†˜οΈŽ Secondary Index (보쑰 인덱슀)λŠ” ν…Œμ΄λΈ”μ˜ κΈ°λ³Έ ν‚€(Primary Key)λ‚˜ ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀(Clustered Index) μ™Έμ˜ λ‹€λ₯Έ 컬럼(Column)에 μΆ”κ°€λ‘œ μƒμ„±λ˜λŠ” μΈλ±μŠ€μž„.
    • β†˜οΈŽ 주둜 검색 μ„±λŠ₯을 κ°œμ„ ν•˜κ±°λ‚˜ νŠΉμ • μ—΄(Column)μ—μ„œμ˜ 쑰회λ₯Ό μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ¨.

βœ…1️⃣ Secondary Index의 핡심 κ°œλ….

1️⃣ κΈ°λ³Έ ν‚€(Primary Key)μ™€μ˜ 차이.

  • β†˜οΈŽ Primary Key : ν…Œμ΄λΈ”μ˜ 주된 인덱슀둜, 데이터가 물리적으둜 정렬됨.
  • β†˜οΈŽ Secondary Index : κΈ°λ³Έ ν‚€(Primary Key)κ°€ μ•„λ‹Œ λ‹€λ₯Έ μ»¬λŸΌμ„ κΈ°μ€€μœΌλ‘œ μƒμ„±λ˜λ©°, λ°μ΄ν„°λŠ” 물리적으둜 μ •λ ¬λ˜μ§€ μ•ŠμŒ.

2️⃣ 포인터 ꡬ쑰.

  • β†˜οΈŽ Secondary IndexλŠ” ν•΄λ‹Ή 컬럼의 값을 μ •λ ¬ν•œ ν›„, κΈ°λ³Έ ν‚€(Primary Key)λ‚˜ 물리적 μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터λ₯Ό 포함함.
    • β†˜οΈŽ 이λ₯Ό 톡해 ν•΄λ‹Ή 컬럼 κ°’μœΌλ‘œ λΉ λ₯΄κ²Œ 데이터λ₯Ό μ°Ύκ³ , κ·Έ 데이터λ₯Ό μ‹€μ œλ‘œ μ‘°νšŒν•  수 있음.

3️⃣ 닀쀑 생성 κ°€λŠ₯.

  • β†˜οΈŽ ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ—λŠ” μ—¬λŸ¬ 개의 Secondary Indexλ₯Ό 생성할 수 있음.
    • β†˜οΈŽ 예λ₯Ό λ“€μ–΄, nameκ³Ό email μ»¬λŸΌμ— 각각 Secondary Indexλ₯Ό 생성할 수 있음.

4️⃣ 읽기/μ“°κΈ° μ„±λŠ₯ νŠΈλ ˆμ΄λ“œμ˜€ν”„.

  • β†˜οΈŽ Secondary IndexλŠ” 읽기 μ„±λŠ₯을 ν–₯μƒμ‹œν‚€μ§€λ§Œ, μ“°κΈ° μ„±λŠ₯(INSERT, UPDATE, DELETE)은 μ €ν•˜λ  수 있음.
    • β†˜οΈŽ 데이터가 변경될 λ•Œλ§ˆλ‹€ 인덱슀λ₯Ό μ—…λ°μ΄νŠΈν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμž„.

βœ…2️⃣ Secondary Index의 μž₯단점.

πŸ‘ μž₯점.

1️⃣ 검색 속도 ν–₯상.

  • νŠΉμ • μ»¬λŸΌμ— λŒ€ν•΄ λΉ λ₯΄κ²Œ 검색 κ°€λŠ₯.

    2️⃣ μ—¬λŸ¬ ν•„λ“œμ— 인덱슀 생성 κ°€λŠ₯.

  • ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ— μ—¬λŸ¬ Secondary Indexλ₯Ό 생성할 수 있음.

    3️⃣ λ‹€μ–‘ν•œ 쿼리 μ΅œμ ν™”.

  • 자주 μ‚¬μš©ν•˜λŠ” WHERE, JOIN, ORDER BY μ ˆμ— ν™œμš© κ°€λŠ₯.

πŸ‘Ž 단점.

1️⃣ μ“°κΈ° μ„±λŠ₯ μ €ν•˜.

  • 데이터 μ‚½μž…, μ—…λ°μ΄νŠΈ, μ‚­μ œ μ‹œ Secondary Index도 ν•¨κ»˜ μ—…λ°μ΄νŠΈλ˜μ–΄μ•Ό ν•˜λ―€λ‘œ μ“°κΈ° μ„±λŠ₯이 μ €ν•˜λ¨.

    2️⃣ 좔가적인 μ €μž₯ 곡간 ν•„μš”.

  • Secondary IndexλŠ” λ³„λ„μ˜ μ €μž₯ 곡간을 차지함.

    3️⃣ λ³΅μž‘ν•œ μœ μ§€ 관리.

  • λ„ˆλ¬΄ λ§Žμ€ μΈλ±μŠ€λŠ” 쿼리 μ΅œμ ν™”λ‚˜ 인덱슀 μž¬κ΅¬μ„±μ— λΆ€ν•˜λ₯Ό 쀄 수 있음.

βœ…3️⃣ Secondary Index vs Clusterd Index

ꡬ뢄 Clustered Index Secondary Index
κΈ°μ€€(Column) Primary Key (주둜) 일반 컬럼 (κΈ°λ³Έ ν‚€ μ™Έ)
물리적 μ •λ ¬ 데이터가 정렬됨 데이터가 μ •λ ¬λ˜μ§€ μ•ŠμŒ
인덱슀 개수 ν•˜λ‚˜λ§Œ 생성 κ°€λŠ₯ μ—¬λŸ¬ 개 생성 κ°€λŠ₯
데이터 μ ‘κ·Ό 방식 직접 데이터 μ ‘κ·Ό 포인터λ₯Ό 톡해 데이터 μ ‘κ·Ό
읽기 μ„±λŠ₯ 빠름 빠름 (ν•˜μ§€λ§Œ 포인터 단계 ν•„μš”)
μ“°κΈ° μ„±λŠ₯ 비ꡐ적 μ•ˆμ •μ  μ“°κΈ° μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯
μ €μž₯ 곡간 비ꡐ적 적음 μΆ”κ°€ μ €μž₯ 곡간 ν•„μš”

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

1️⃣ 자주 κ²€μƒ‰ν•˜λŠ” 컬럼.

  • νŠΉμ • μ»¬λŸΌμ„ 자주 μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ‘°νšŒν•  λ•Œ.

    2️⃣ WHERE 절 μ‚¬μš© λΉˆλ„κ°€ 높은 컬럼.

  • νŠΉμ • 쑰건으둜 자주 필터링할 λ•Œ.

    3️⃣ JOIN μ—°μ‚° μ΅œμ ν™”.

  • λ‹€λ₯Έ ν…Œμ΄λΈ”κ³Ό JOINν•  λ•Œ ν‚€λ‘œ 자주 μ‚¬μš©λ˜λŠ” 컬럼.

πŸš€ 정리.

  • Secondary Index(보쑰 인덱슀)λŠ” κΈ°λ³Έ ν‚€λ‚˜ Clustered Index(ν΄λŸ¬μŠ€ν„°ν˜• 인덱슀) μ™Έμ˜ λ‹€λ₯Έ μ»¬λŸΌμ— λŒ€ν•΄ μΆ”κ°€λ‘œ μƒμ„±λ˜λŠ” 인덱슀.
  • 주둜 자주 μ‘°νšŒλ˜λŠ” νŠΉμ • μ»¬λŸΌμ— λŒ€ν•œ 검색 μ„±λŠ₯을 κ°œμ„ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©.
    • ν•˜μ§€λ§Œ λ„ˆλ¬΄ λ§Žμ€ Secondary Indexλ₯Ό μƒμ„±ν•˜λ©΄ μ“°κΈ° μ„±λŠ₯ μ €ν•˜ 및 μ €μž₯ 곡간 λ‚­λΉ„κ°€ λ°œμƒν•  수 있음

πŸ”‘ 핡심 포인트.

  • 읽기 μ„±λŠ₯ μ΅œμ ν™”.
  • 닀쀑 생성 κ°€λŠ₯.
  • μ“°κΈ° μ„±λŠ₯ μ €ν•˜ 주의.
    πŸ‘‰ Secondary IndexλŠ” λ°μ΄ν„°λ² μ΄μŠ€ 섀계 μ‹œ 쑰회 νŒ¨ν„΄κ³Ό 데이터 λ³€κ²½ λΉˆλ„λ₯Ό κ³ λ €ν•˜μ—¬ μ‹ μ€‘ν•˜κ²Œ 선택해야 함.