βπΎ[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μ μ¬μ©ν νμ΄μ§ μ‘°ν λ°©μμ μ±λ₯ μ νκ° λ°μν μ μμ΅λλ€.
βμ±λ₯ λ¬Έμ .
-
-
OFFSET μ¦κ° μ κ²μ μλ μ ν
- OFFSETμ 건λλ΄ λ°μ΄ν°λ λ΄λΆμ μΌλ‘ μ½μ΄μΌ νλ―λ‘, OFFSET κ°μ΄ ν΄μλ‘ μ‘°ν μκ°μ΄ κΈΈμ΄μ§.
-
OFFSET μ¦κ° μ κ²μ μλ μ ν
- μμ
SELECT *
FROM article
ORDER BY created_at DESC
LIMIT 10 OFFSET 100000;
-
MySQLμ μ²μλΆν° 100,000κ°μ λ°μ΄ν°λ₯Ό μ½μ ν, 10κ°λ§ λ°ννλ―λ‘ λΉν¨μ¨μ .
-
-
νμ΄μ§κ° λ€λ‘ κ°μλ‘ μ±λ₯ μ ν
- νμ΄μ§κ° 컀μ§μλ‘ 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λ³΄λ€ μ±λ₯μ΄ λ°μ΄λ¨.
- μΈλ±μ€λ₯Ό νμ©νμ¬ ν¨μ¨μ μΈ κ²μ κ°λ₯.