Home > DB > πŸ’Ύ[Database] κ²Œμ‹œκΈ€ λͺ©λ‘ 쑰회 - νŽ˜μ΄μ§• 처리

πŸ’Ύ[Database] κ²Œμ‹œκΈ€ λͺ©λ‘ 쑰회 - νŽ˜μ΄μ§• 처리
Database

πŸ’Ύ[Database] κ²Œμ‹œκΈ€ λͺ©λ‘ 쑰회 - νŽ˜μ΄μ§• 처리.

βœ…1️⃣ λΉ„νš¨μœ¨μ μΈ νŽ˜μ΄μ§• 처리.

  • β†˜οΈŽ μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ˜ λ©”λͺ¨λ¦¬λ‘œ λ””μŠ€ν¬μ— μ €μž₯된 λͺ¨λ“  데이터λ₯Ό κ°€μ Έμ˜€κ³ , νŠΉμ • νŽ˜μ΄μ§€λ§Œ μΆ”μΆœν•˜λŠ” 것은 λΉ„νš¨μœ¨μ μž„.
    • β†˜οΈŽ λ””μŠ€ν¬ 접근은 λ©”λͺ¨λ¦¬ 접근보닀 느리기 λ•Œλ¬Έμž„.
      • β†˜οΈŽ λ””μŠ€ν¬ I/O λΉ„μš©
    • β†˜οΈŽ λ””μŠ€ν¬μ— μ €μž₯된 λ°μ΄ν„°λŠ” λ©”λͺ¨λ¦¬ μš©λŸ‰μ„ μ΄ˆκ³Όν•  수 있음.
      • β†˜οΈŽ Out of Memory(OOM)
        • β†˜οΈŽ μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ λ©”λͺ¨λ¦¬κ°€ λͺ¨λ‘ μ‚¬μš©λ˜μ–΄ 더 이상 ν•  λ‹Ήν•  수 μ—†λŠ” 상황.

          βœ…2️⃣ 효율적인 νŽ˜μ΄μ§• 처리.

  • β†˜οΈŽ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ νŠΉμ • νŽ˜μ΄μ§€μ˜ λ°μ΄ν„°λ§Œ λ°”λ‘œ μΆ”μΆœν•˜λŠ” 방법이 ν•„μš”ν•¨.
    • β†˜οΈŽ νŽ˜μ΄μ§• 쿼리

      βœ…3️⃣ νŽ˜μ΄μ§• 방식.

  • β†˜οΈŽ ν΄λΌμ΄μ–ΈνŠΈ λ˜λŠ” μ„œλΉ„μŠ€ νŠΉμ„±μ— 따라 크게 두 κ°€μ§€λ‘œ λ‚˜λ‰¨
    • β†˜οΈŽ νŽ˜μ΄μ§€ 번호
    • β†˜οΈŽ ** λ¬΄ν•œ 슀크둀**

      πŸ“Œ νŽ˜μ΄μ§€ 번호 방식.

  • β†˜οΈŽ 이동할 νŽ˜μ΄μ§€ λ²ˆν˜Έκ°€ λͺ…μ‹œμ μœΌλ‘œ 지정됨.
  • β†˜οΈŽ μ›ν•˜λŠ” νŽ˜μ΄μ§€λ‘œ μ¦‰μ‹œ 이동 κ°€λŠ₯.

    πŸ“Œ λ¬΄ν•œ 슀크둀 방식.

  • β†˜οΈŽ μŠ€ν¬λ‘€μ„ 내리면 λ‹€μŒ 데이터가 쑰회됨. ➞ 더보기.
  • β†˜οΈŽ 주둜 λͺ¨λ°”일 ν™˜κ²½μ—μ„œ μ‚¬μš©ν•¨.

βœ…4️⃣ νŽ˜μ΄μ§€ 번호 방식.

  • β†˜οΈŽ ν•„μš”ν•œ 정보
    • β†˜οΈŽ 1️⃣ N번 νŽ˜μ΄μ§€μ—μ„œ M개의 κ²Œμ‹œκΈ€
    • β†˜οΈŽ 2️⃣ κ²Œμ‹œκΈ€μ˜ 개수
      • β†˜οΈŽ νŽ˜μ΄μ§€ 번호 ν™œμ„±ν™”μ— ν•„μš”.
      • β†˜οΈŽ μ˜ˆμ‹œ: νŽ˜μ΄μ§€ λ‹Ή 30개의 κ²Œμ‹œκΈ€μ„ 보여주고, 총 94개의 κ²Œμ‹œκΈ€μ΄ μžˆλ‹€λ©΄, μ‚¬μš©μžλŠ” ν΄λΌμ΄μ–ΈνŠΈ ν™”λ©΄μ—μ„œ 4번 νŽ˜μ΄μ§€κΉŒμ§€ 이동할 수 μžˆλ‹€λŠ” 사싀을 인지해야 함.
    • β†˜οΈŽ 3️⃣ N번 νŽ˜μ΄μ§€μ—μ„œ M개의 κ²Œμ‹œκΈ€μ„ μ‘°νšŒν•˜λ €λ©΄?
      • β†˜οΈŽ SQL offset, limit을 ν™œμš©ν•˜μ—¬ νŽ˜μ΄μ§€ 쿼리λ₯Ό ν•  수 있음.
      • β†˜οΈŽ offset 지점뢀터, limit개의 데이터 쑰회.
    • β†˜οΈŽ 4️⃣ SELECT 쿼리둜 λ§Œλ“€μ–΄λ³΄λ©΄?
      • β†˜οΈŽ κ²Œμ‹œνŒλ³„ κ²Œμ‹œκΈ€ λͺ©λ‘ μ΅œμ‹ μˆœ 쑰회
        • β†˜οΈŽ shard key = board_id이기 λ•Œλ¬Έμ—, 단일 μƒ€λ“œμ—μ„œ μ‘°νšŒν•  수 있음.
        • β†˜οΈŽ limit = M개의 κ²Œμ‹œκΈ€
        • β†˜οΈŽ offset = (N번 νŽ˜μ΄μ§€ - 1) * M
          • β†˜οΈŽ N > 0
      • β†˜οΈŽ SQL QUERY
          SELECT * FROM article // κ²Œμ‹œκΈ€ ν…Œμ΄λΈ”
          WHERE board_id = {board_id} // κ²Œμ‹œνŒλ³„
          ORDER BY created_at DESC // μ΅œμ‹ μˆœ
          LIMIT {LIMIT} OFFSET {OFFSET}; // N번 νŽ˜μ΄μ§€μ—μ„œ M개
        

      • β†˜οΈŽ 1,200만 건의 적은 λ°μ΄ν„°μ—μ„œ 30개의 κ²Œμ‹œκΈ€μ„ μ‘°νšŒν•˜λŠ”λ° 4μ΄ˆκ°€ μ†Œμš”λ˜μ—ˆμŒ. μ •μƒμ μœΌλ‘œ μ„œλΉ„μŠ€ν•˜κΈ°μ—λŠ” μ–΄λ €μš΄ μƒν™©μž„.

      • β†˜οΈŽ explain select * from article where board_id = 1 order by created_at desc limit 30 offset 90;
      • β†˜οΈŽ type = ALL ➞ ν…Œμ΄λΈ” 전체λ₯Ό μ½λŠ”λ‹€ (ν’€ μŠ€μΊ”)
      • β†˜οΈŽ Extras = Using where; Using filesort ➞ where 절둜 쑰건에 λŒ€ν•΄ 필터링,
        • β†˜οΈŽ 데이터가 많기 λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬μ—μ„œ 정렬을 μˆ˜ν–‰ν•  수 μ—†μ–΄μ„œ, 파일(λ””μŠ€ν¬)μ—μ„œ 데이터λ₯Ό μ •λ ¬ν•˜λŠ” filesort μˆ˜ν–‰
        • β†˜οΈŽ 전체 데이터에 λŒ€ν•΄ 필터링 및 μ •λ ¬ν•˜κΈ° λ•Œλ¬Έμ— μ•„μ£Ό 큰 λΉ„μš©μ΄ λ“  것.

πŸ™‹β€β™‚οΈ Query Plain
λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 쿼리에 μ˜ν•΄ 데이터 접근이 μ‹€ν–‰λ˜λŠ” κ³„νš λ˜λŠ” 절차 μ‚¬μš©λ²•.
explain {query}

βœ…5️⃣ μΈλ±μŠ€μ— λŒ€ν•œ 이해

πŸ“Œ Intro

  • β†˜οΈŽ 인덱슀(Index)λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό λΉ λ₯΄κ²Œ κ²€μƒ‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 데이터 ꡬ쑰.
  • β†˜οΈŽ μ±…μ˜ 색인(Index)κ³Ό λΉ„μŠ·ν•œ κ°œλ…μœΌλ‘œ, νŠΉμ • 데이터λ₯Ό μ°ΎκΈ° μœ„ν•΄ λͺ¨λ“  데이터λ₯Ό μ²˜μŒλΆ€ν„° λκΉŒμ§€ νƒμƒ‰ν•˜μ§€ μ•Šκ³ λ„ μ›ν•˜λŠ” 데이터λ₯Ό 효율적으둜 μ‘°νšŒν•  수 μžˆλ„λ‘ λ„μ™€μ€Œ.

βœ…6️⃣ 인덱슀의 핡심 κ°œλ….

  • β†˜οΈŽ λΉ λ₯Έ 검색 : ν…Œμ΄λΈ”μ—μ„œ νŠΉμ • 데이터λ₯Ό 더 λΉ λ₯΄κ²Œ 찾을 수 있음.
  • β†˜οΈŽ μ •λ ¬λœ ꡬ쑰 : μΈλ±μŠ€λŠ” 일반적으둜 B-Tree λ˜λŠ” Hash ꡬ쑰λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό 정렬함.
  • β†˜οΈŽ 쑰회 μ„±λŠ₯ ν–₯상 : WHERE, JOIN, BY와 같은 SQL μ—°μ‚° μ‹œ μ„±λŠ₯을 κ°œμ„ ν•¨.
  • β†˜οΈŽ 곡간 차지 : 인덱슀λ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄ 좔가적인 μ €μž₯ 곡간이 ν•„μš”ν•¨.
  • β†˜οΈŽ μ“°κΈ° μ„±λŠ₯ μ €ν•˜ : INSERT, UPDATE, DELETE μž‘μ—… μ‹œ 인덱슀λ₯Ό μ—…λ°μ΄νŠΈν•΄μ•Ό ν•˜λ―€λ‘œ μ“°κΈ° μž‘μ—…μ˜ μ„±λŠ₯이 μ €ν•˜λ  수 있음.

βœ…7️⃣ 인덱슀의 μž‘λ™ 원리.

  • β†˜οΈŽ λ°μ΄ν„°λ² μ΄μŠ€λŠ” ν…Œμ΄λΈ”μ˜ νŠΉμ • 컬럼(μ—΄)에 인덱슀λ₯Ό 생성함.
  • β†˜οΈŽ SQL 쿼리λ₯Ό μ‹€ν–‰ν•  λ•Œ, μΈλ±μŠ€κ°€ μžˆλŠ” μ»¬λŸΌμ„ κΈ°μ€€μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€ 엔진은 인덱슀λ₯Ό λ¨Όμ € μ‘°νšŒν•¨.
  • β†˜οΈŽ 인덱슀λ₯Ό 톡해 λ°μ΄ν„°μ˜ μœ„μΉ˜λ₯Ό μ°Ύκ³ , ν•΄λ‹Ή μœ„μΉ˜μ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜΄.

βœ…8️⃣ 인덱슀의 μ’…λ₯˜.

1️⃣ 일반 인덱슀(B-Tree Index)

  • β†˜οΈŽ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” 인덱슀.
  • β†˜οΈŽ 컬럼의 값을 μ˜€λ¦„μ°¨μˆœ λ˜λŠ” λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ μ €μž₯함.

2️⃣ 고유 인덱슀(Unique Index)

  • β†˜οΈŽ μΈλ±μŠ€κ°€ μ§€μ •λœ μ»¬λŸΌμ€ μ€‘λ³΅λœ 값을 κ°€μ§ˆ 수 μ—†μŒ.
  • β†˜οΈŽ PRIMARY KEYλ‚˜ UNIQUE μ œμ•½ 쑰건이 ν¬ν•¨λœ 경우 μžλ™μœΌλ‘œ 생성됨.

3️⃣ 볡합 인덱슀(Composite Index)

  • β†˜οΈŽ 두 개 μ΄μƒμ˜ μ»¬λŸΌμ„ κ²°ν•©ν•˜μ—¬ ν•˜λ‚˜μ˜ 인덱슀λ₯Ό λ§Œλ“¦.
  • β†˜οΈŽ 볡합 μΈλ±μŠ€λŠ” μ—¬λŸ¬ 쑰건을 λ™μ‹œμ— μ‚¬μš©ν•  λ•Œ 유용.

4️⃣ ν’€ν…μŠ€νŠΈ 인덱슀(Full-Text Index)

  • β†˜οΈŽ λ¬Έμžμ—΄ 검색에 μ΅œμ ν™”λœ 인덱슀.
  • β†˜οΈŽ λŒ€λŸ‰μ˜ ν…μŠ€νŠΈ 데이터λ₯Ό 검색할 λ•Œ μ‚¬μš©.

5️⃣ ν•΄μ‹œ 인덱슀(Hash Index)

  • β†˜οΈŽ 값을 ν•΄μ‹œ ν•¨μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ μ €μž₯.
  • β†˜οΈŽ μ •ν™•ν•œ 값을 λΉ λ₯΄κ²Œ 찾을 λ•Œ μ‚¬μš©.

βœ…9️⃣ 인덱슀λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 경우.

  • β†˜οΈŽ WHERE 절둜 νŠΉμ • 데이터λ₯Ό 자주 μ‘°νšŒν•  λ•Œ.
  • β†˜οΈŽ JOIN 연산이 λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•  λ•Œ.
  • β†˜οΈŽ ORDER BY λ˜λŠ” GROUP BY 절둜 μ •λ ¬μ΄λ‚˜ κ·Έλ£Ήν™”κ°€ ν•„μš”ν•  λ•Œ
  • β†˜οΈŽ 자주 μ‚¬μš©λ˜λŠ” μ»¬λŸΌμ— λŒ€ν•΄ λΉ λ₯Έ 검색이 ν•„μš”ν•  λ•Œ.

βœ…1️⃣0️⃣ 인덱슀 μ‚¬μš© μ‹œ 주의점.

  • β†˜οΈŽ κ³Όλ„ν•œ 인덱슀 생성 : λ„ˆλ¬΄ λ§Žμ€ μΈλ±μŠ€λŠ” μ“°κΈ° μ„±λŠ₯을 μ €ν•˜μ‹œν‚€κ³ , 좔가적인 μ €μž₯ 곡간을 차지함.
  • β†˜οΈŽ λΆˆν•„μš”ν•œ 인덱슀 : 자주 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μΈλ±μŠ€λŠ” 였히렀 μ„±λŠ₯ μ €ν•˜λ₯Ό μœ λ°œν•  수 있음.
  • β†˜οΈŽ 인덱슀 히트 λΉ„μœ¨(Index Hit Rate) : 쿼리가 인덱슀λ₯Ό μ œλŒ€λ‘œ ν™œμš©ν•˜λŠ”μ§€ λͺ¨λ‹ˆν„°λ§ν•΄μ•Ό 함.