πŸͺ kakaotech campus

SQL | νŽ˜μ΄μ§€λ„€μ΄μ…˜

c0zi 2023. 6. 10. 14:16

1. νŽ˜μ΄μ§€λ„€μ΄μ…˜(Pasination)μ΄λž€


  • μ½˜ν…μΈ λ₯Ό μ—¬λŸ¬ νŽ˜μ΄μ§€λ‘œ λ‚˜λˆ„μ–΄ λ‹€μŒ λ˜λŠ” 이전 νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜κ±°λ‚˜ νŠΉμ • νŽ˜μ΄μ§€λ‘œ 이동할 수 μžˆλŠ” μš”μ†Œ
  • λ¦¬μŠ€νŠΈκ°€ λ§Žμ•„ ν•œ 화면에 κ³Όλ„ν•œ 슀크둀이 λ°œμƒν•˜κ²Œ λ˜λŠ” 경우 적용

 

1.1 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” 이유

λ§Žμ€ μ–‘μ˜ 데이터λ₯Ό λ‹΄κ³  μžˆλŠ” μ„œλ²„μ˜ 경우 μ‚¬μš©μžκ°€ 접속할 λ•Œλ§ˆλ‹€ 전체 데이터λ₯Ό λͺ¨λ‘ κ°€μ Έμ˜€λ €λ©΄ 였랜 μ‹œκ°„μ΄ ν•„μš”ν•˜κ³ , μ΄λŠ” μ‚¬μš©μžμ˜ νŽΈλ¦¬μ„± μΈ‘λ©΄μ—μ„œ μ’‹μ§€ λͺ»ν•œ κ²°κ³Όκ°€ λ°œμƒν•œλ‹€. 이λ₯Ό μœ„ν•΄ νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ μ΄μš©ν•΄ 데이터λ₯Ό μ‘°κΈˆμ”© λ‚˜λˆ„μ–΄ κ°€μ Έμ˜€κ³  더 쉽고 λΉ λ₯Έ 접근을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

 

1.2 νŽ˜μ΄μ§€ λ„€μ΄μ…˜μ˜ μ’…λ₯˜

- μ˜€ν”„μ…‹ νŽ˜μ΄μ§• : DB의 offset 쿼리λ₯Ό μ‚¬μš©ν•˜μ—¬ 'νŽ˜μ΄μ§€' λ‹¨μœ„λ‘œ κ΅¬λΆ„ν•˜μ—¬ μš”μ²­/μ‘λ‹΅ν•˜κ²Œ κ΅¬ν˜„

- μ»€μ„œ νŽ˜μ΄μ§• : ν΄λΌμ΄μ–ΈνŠΈκ°€ κ°€μ Έκ°„ λ§ˆμ§€λ§‰ row의 μˆœμ„œμƒ λ‹€μŒ row듀을 n개 μš”μ²­/μ‘λ‹΅ν•˜κ²Œ κ΅¬ν˜„

 


2. μ˜€ν”„μ…‹ νŽ˜μ΄μ§•


ν”νžˆ λ³Ό 수 μžˆλŠ” λ‹€μŒκ³Ό 같은 νŽ˜μ΄μ§• κ΅¬ν˜„μ„ μ˜€ν”„μ…‹ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ΄λΌκ³  ν•œλ‹€. ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ λͺ…μ‹œμ μΈ νŽ˜μ΄μ§€ λ²„νŠΌκ³Ό ν•¨κ»˜ 쓰이며, λ²„νŠΌμ„ ν΄λ¦­ν•¨μœΌλ‘œμ¨ νŽ˜μ΄μ§€λ₯Ό νœ™νœ™ λ„˜κΈΈ 수 μžˆλ‹€.

λΈ”λ‘œκ·Έ ν•˜λ‹¨ λΆ€λΆ„

μ„œλ²„κ°€ λ°μ΄ν„°λ² μ΄μŠ€μ™€ 톡신해 퀴리에 LIMITκ³Ό OFFSET을 톡해 자료λ₯Ό μš”μ²­ν•œλ‹€.

SELECT * FROM table
ORDER BY timestamp
OFFSET {μ˜€ν”„μ…‹}
LIMIT {νŽ˜μ΄μ§€ λ‹Ή 자료의 κ°―}

 

2.1 μ˜€ν”„μ…‹ 기반 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ˜ 문제점

 

데이터 크기에 λ”°λ₯Έ 문제

λ§ˆμ§€λ§‰ νŽ˜μ΄μ§€λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ 전체 갯수λ₯Ό μ•Œμ•„μ•Όν•˜λ©°, 데이터 μ‚¬μ΄μ¦ˆκ°€ 컀질 수둝 전체 데이터 갯수λ₯Ό κ΅¬ν•˜λŠ” 것이 λΆ€ν•˜κ°€ 될 수 μžˆλ‹€. λ˜ν•œ, OFFSET이 컀진닀면 λΆˆν•„μš”ν•œ 데이터 μ‘°νšŒκ°€ λ§Žμ•„μ§€κ³  μ΄λŠ” 속도에 영ν–₯을 미치게 λœλ‹€.

 

데이터 쀑볡 및 λˆ„λ½

OFFSET λ°©μ‹μ˜ 경우 λ°μ΄ν„°μ˜ μž¦μ€ 좔가와 μ‚­μ œκ°€ μžˆλŠ” κ²½μš°μ— 데이터가 μ€‘λ³΅λ˜κ±°λ‚˜ λˆ„λ½λ˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€. 

 

이와 같은 λ¬Έμ œμ λ“€λ‘œ 인해 λ°μ΄ν„°μ˜ 크기가 크고, μˆ˜μ •μ΄ λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•œλ‹€λ©΄ OFFSET λ°©μ‹λ³΄λ‹€λŠ” CURSOR 방식이 더 μ ν•©ν•˜λ‹€κ³  λ³Ό 수 μžˆλ‹€.

 


3. μ»€μ„œ νŽ˜μ΄μ§•


이 방법은 μ‹€μ‹œκ°„ 데이터와 λŒ€λŸ‰μ˜ 데이터(페이슀뢁, μŠ¬λž™ , νŠΈμœ„ν„° λ“±)을 λ‹€λ£¨λŠ” μ›Ήμ‚¬μ΄νŠΈμ—μ„œ μ“°μ΄λŠ” νŽ˜μ΄μ§• 방법이닀.

ν”„λ‘ νŠΈμ—μ„œ λ¬΄ν•œ 슀크둀(μΈμŠ€νƒ€ 그램, 페이슀뢁처럼 ν•˜λ‹¨μœΌλ‘œ 계속 슀크둀 λ˜λŠ” νŽ˜μ΄μ§• 방식)을 지원할 λ•Œ 쓰인닀.

 

cursor λ°©μ‹μ˜ νŽ˜μ΄μ§€λ„€μ΄μ…˜

 

μ»€μ„œ 기반 νŽ˜μ΄μ§•μ€ νŽ˜μ΄μ§€ λ²ˆν˜Έκ°€ μ•„λ‹Œ ν‚€ 번호λ₯Ό 톡해 νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ κ΅¬ν˜„ν•œλ‹€. 

SELECT * FROM product LIMIT 40 // 1~40κΉŒμ§€μ˜ κ°’ λ°˜ν™˜
SELECT * FROM product WHERE id > {κΈ°μ€€κ°’} LIMIT 40;

 

3.1 μ»€μ„œ 기반 νŽ˜μ΄μ§•μ˜ 단점

ν•˜μ§€λ§Œ μ»€μ„œ 기반 νŽ˜μ΄μ§•λ„ 전체 데이터λ₯Ό μ‘°νšŒν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ˜€ν”„μ…‹ 기반 νŽ˜μ΄μ§•κ³Ό 같이 νŽ˜μ΄μ§€ λ²„νŠΌμ˜ UI κ΅¬ν˜„μ΄ μ–΄λ ΅λ‹€λŠ” 단점이 μžˆκΈ°λ„ ν•˜λ‹€.

 


πŸ“‹ 참고자료


1. http://61.107.76.13/Li/04_25.html

2. https://betterdev.tistory.com/17

 

Paginationμ΄λž€ (νŽ˜μ΄μ§• 처리) - Offset vs Cursor

1. Paginationμ΄λž€ Paginationμ΄λž€ 검색 κ²°κ³Όλ₯Ό κ°€μ Έμ˜¬ λ•Œ 데이터λ₯Ό μͺΌκ°œ 번호λ₯Ό 맀겨 μΌλΆ€λ§Œ κ°€μ Έμ˜€λŠ” 기법이닀 1.1 Pagination을 μ‚¬μš©ν•˜λŠ” 이유 μ‚¬μš©μžκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‚¬μš© 쀑 κ²Œμ‹œνŒ, μƒν’ˆ λͺ©λ‘ 등을

betterdev.tistory.com