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

πŸ’Ύ[Database] κ²Œμ‹œκΈ€ λͺ©λ‘ 쑰회 - νŽ˜μ΄μ§€ 번호
Database Native SQL Query MySQL

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

🍎 Intro

  • 이 방식은 μ‚¬μš©μžκ°€ νŠΉμ • νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•˜λ©΄ ν•΄λ‹Ή νŽ˜μ΄μ§€μ˜ λ°μ΄ν„°λ§Œ κ°€μ Έμ™€μ„œ μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

βœ…1️⃣ νŽ˜μ΄μ§€ 번호 λ°©μ‹μ΄λž€?

  • κ²Œμ‹œκΈ€μ„ μ—¬λŸ¬ νŽ˜μ΄μ§€λ‘œ λ‚˜λˆ„κ³ , μ‚¬μš©μžκ°€ νŠΉμ • νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•˜λ©΄ ν•΄λ‹Ή νŽ˜μ΄μ§€μ˜ λ°μ΄ν„°λ§Œ μ‘°νšŒν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
  • 일반적으둜 β€œLIMIT”와 β€œOFFSET”을 ν™œμš©ν•˜μ—¬ νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ 데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.

πŸ“Œ1️⃣ νŽ˜μ΄μ§€ 번호 λ°©μ‹μ—μ„œ LIMITκ³Ό OFFSET의 의미.

  • LIMITκ³Ό OFFSET은 νŽ˜μ΄μ§€ 번호 방식(Pagination)μ—μ„œ νŠΉμ • νŽ˜μ΄μ§€μ˜ λ°μ΄ν„°λ§Œ μ‘°νšŒν•  λ•Œ μ‚¬μš©λ˜λŠ” SQL ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.
    • LIMIT ➞ κ°€μ Έμ˜¬ 데이터 개수
    • OFFSET ➞ κ±΄λ„ˆλ›Έ 데이터 개수
      • 즉, LIMITκ³Ό OFFSET을 ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ νŠΉμ • νŽ˜μ΄μ§€μ— ν•΄λ‹Ήν•˜λŠ” λ°μ΄ν„°λ§Œ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ2️⃣ LIMIT의 의미.

  • LIMITμ΄λž€?
    • LIMIT은 μ΅œλŒ€ λͺ‡ 개의 ν–‰(ROW)을 κ°€μ Έμ˜¬μ§€ κ²°μ •ν•˜λŠ” SQL ν‚€μ›Œλ“œ μž…λ‹ˆλ‹€.
    • 주둜 νŽ˜μ΄μ§€ 크기(Page Size)λ₯Ό μ„€μ •ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

πŸ“Œ 예제: LIMIT.

SELECT *
FROM article
ORDER BY created_at DESC
LIMIT 10;
  • μ‹€ν–‰ κ²°κ³Ό
    • κ°€μž₯ μ΅œμ‹ (created_at DESC) κΈ°μ€€μœΌλ‘œ μ΅œλŒ€ 10개의 λ°μ΄ν„°λ§Œ κ°€μ Έμ˜΅λ‹ˆλ‹€.

πŸ“Œ3️⃣ LIMIT의 νŠΉμ§•.

  • 항상 첫 번째 데이터뢀터 κ°€μ Έμ˜΅λ‹ˆλ‹€.(즉, 1νŽ˜μ΄μ§€).
  • νŠΉμ • νŽ˜μ΄μ§€λ₯Ό μ‘°νšŒν•˜λ €λ©΄ OFFSETκ³Ό ν•¨κ»˜ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

πŸ“Œ2️⃣ OFFSET의 의미.

  • OFFSETμ΄λž€?
    • OFFSET은 μ•žμ—μ„œλΆ€ν„° κ±΄λ„ˆλ›Έ 데이터 개수λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
    • 보톡 LIMITκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ νŠΉμ • νŽ˜μ΄μ§€μ˜ 데이터λ₯Ό κ°€μ Έμ˜¬ λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

πŸ“Œ 예제: OFFSET(2νŽ˜μ΄μ§€ 쑰회)

SELECT *
FROM article
ORDER BY created_at DESC
LIMIT 10 OFFSET 10;
  • μ‹€ν–‰ κ²°κ³Ό
    • OFFSET 10 ➞ μ•žμ˜ 10개 데이터λ₯Ό κ±΄λ„ˆ λœ€.
    • LIMIT 10 ➞ κ·Έ λ‹€μŒ 10개 데이터 κ°€μ Έμ˜΄(즉, 11~20번째 데이터).

βœ…2️⃣ νŽ˜μ΄μ§€ 번호 λ°©μ‹μ˜ SQL 쿼리.

  • MySQLμ—μ„œ 일반적인 νŽ˜μ΄μ§€ 번호 기반 κ²Œμ‹œκΈ€ 쑰회 μΏΌλ¦¬λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
SELECT *
FROM article
ORDER BY created_at DESC
LIMIT 10 OFFSET 20; -- 3νŽ˜μ΄μ§€ (νŽ˜μ΄μ§€ 크기: 10)
  • μ„€λͺ…
    • ORDER BY created_at DESC ➞ μ΅œμ‹  κ²Œμ‹œκΈ€λΆ€ν„° μ •λ ¬.
    • LIMIT 10 ➞ ν•œ λ²ˆμ— 10개의 κ²Œμ‹œκΈ€μ„ κ°€μ Έμ˜΄.
    • OFFSET 20 ➞ μ•žμ˜ 20개 데이터λ₯Ό κ±΄λ„ˆλ›°κ³ (=2νŽ˜μ΄μ§€κΉŒμ§€ κ±΄λ„ˆλœ€), 3νŽ˜μ΄μ§€λΆ€ν„° κ°€μ Έμ˜΄.

βœ…3️⃣ λŒ€κ·œλͺ¨ λ°μ΄ν„°μ—μ„œ λ°œμƒν•˜λŠ” 문제점.

  • 데이터가 λ§Žμ„ 경우 OFFSET을 μ‚¬μš©ν•œ νŽ˜μ΄μ§€ 쑰회 방식은 μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βŒμ„±λŠ₯ 문제.

    1. OFFSET 증가 μ‹œ 검색 속도 μ €ν•˜
      • OFFSET은 κ±΄λ„ˆλ›΄ 데이터도 λ‚΄λΆ€μ μœΌλ‘œ 읽어야 ν•˜λ―€λ‘œ, OFFSET 값이 클수둝 쑰회 μ‹œκ°„μ΄ 길어짐.
  • μ˜ˆμ‹œ
SELECT *
FROM article
ORDER BY created_at DESC
LIMIT 10 OFFSET 100000;
  • MySQL은 μ²˜μŒλΆ€ν„° 100,000개의 데이터λ₯Ό 읽은 ν›„, 10개만 λ°˜ν™˜ν•˜λ―€λ‘œ λΉ„νš¨μœ¨μ .

    1. νŽ˜μ΄μ§€κ°€ λ’€λ‘œ 갈수둝 μ„±λŠ₯ μ €ν•˜
      • νŽ˜μ΄μ§€κ°€ 컀질수둝 OFFSET 값이 μ»€μ§€λ©΄μ„œ λ°μ΄ν„°λ² μ΄μŠ€ λΆ€ν•˜ 증가.
  • μ˜ˆμ‹œ: 1,000,000번째 κ²Œμ‹œκΈ€μ„ μ‘°νšŒν•˜λŠ” 경우
SELECT * 
FROM article
ORDER BY created_at DESC
LIMIT 10 OFFSET 999990;
  • 이 경우 999,990개의 데이터λ₯Ό λ¨Όμ € μŠ€μΊ”ν•œ ν›„, λ§ˆμ§€λ§‰ 10개만 λ°˜ν™˜ ➞ 맀우 느림

βœ…4️⃣ λŒ€κ·œλͺ¨ λ°μ΄ν„°μ—μ„œ νŽ˜μ΄μ§€ 번호 방식 μ΅œμ ν™”.

  • λŒ€κ·œλͺ¨ λ°μ΄ν„°μ—μ„œ μ„±λŠ₯을 κ°œμ„ ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ κ°€μ§€ μ΅œμ ν™” 방법이 μžˆμŠ΅λ‹ˆλ‹€.

βœ…1️⃣ μ»€μ„œ 기반 νŽ˜μ΄μ§•(Cursor-Based Pagination)

  • OFFSET을 μ‚¬μš©ν•˜μ§€ μ•Šκ³ , β€œν˜„μž¬ νŽ˜μ΄μ§€μ˜ λ§ˆμ§€λ§‰ 데이터”λ₯Ό κΈ°μ€€μœΌλ‘œ λ‹€μŒ 데이터λ₯Ό μ‘°νšŒν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
SELECT *
FROM article
WHERE created_at < '2025-01-31 12:00:00'
ORDER BY created_at DESC
LIMIT 10;
  • μž₯점.
    • OFFSET을 μ‚¬μš©μžμ§€ μ•Šμ•„ κ±΄λ„ˆλ›΄ λ°μ΄ν„°μ˜ λΆˆν•„μš”ν•œ 쑰회λ₯Ό λ°©μ§€.
    • 데이터가 λ§Žμ•„λ„ μ„±λŠ₯이 μΌμ •ν•˜κ²Œ μœ μ§€.
    • 일반적인 SNS(페이슀뢁, νŠΈμœ„ν„°) 및 λŒ€ν˜• κ²Œμ‹œνŒμ—μ„œ 많이 μ‚¬μš©.

βœ…2️⃣ ID 기반 νŽ˜μ΄μ§•

  • κ²Œμ‹œκΈ€μ˜ κ³ μœ ν•œ IDλ₯Ό ν™œμš©ν•˜μ—¬ νŽ˜μ΄μ§•μ„ μˆ˜ν–‰ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
SELECT *
FROM article
WHERE article_id < 1050
ORDER BY article_id DESC
LIMIT 10;
  • μž₯점.
    • νŠΉμ • IDλ₯Ό κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό κ°€μ Έμ™€μ„œ OFFSET보닀 μ„±λŠ₯이 뛰어남.
    • 인덱슀λ₯Ό ν™œμš©ν•˜μ—¬ 효율적인 검색 κ°€λŠ₯.