๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ”ฌapplication/- Database

์˜คํ”„์…‹ ํŽ˜์ด์ง•์ด ๋Š๋ฆฐ ์ง„์งœ ์ด์œ 

by Wonit 2023. 11. 19.

 

์ด ๊ธ€์€ offset based pagination ์„ ๋นŒ๋ฏธ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‚ด๋ถ€ ๋™์ž‘๊ณผ ์—ฌ๋Ÿฌ ๊ฐœ๋…๋“ค์„ ์•Œ์•„๋ณด๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค.

 

2๊ฐœ์˜ ๊ธ€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , ๊ฐ๊ฐ์˜ ๊ธ€์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” insight ๊ฐ€ ๋‹ค๋ฅด๋‹ˆ ํ•จ๊ป˜ ์ฝ์œผ๋ฉด ๋”์šฑ ์œ ์ตํ•ฉ๋‹ˆ๋‹ค.

 

  1. ์˜คํ”„์…‹ ํŽ˜์ด์ง•์ด ๋Š๋ฆฐ ์ง„์งœ ์ด์œ  <- ํ˜„์žฌ ๊ธ€
  2. ์˜คํ”„์…‹ ํŽ˜์ด์ง•, ๋‹จ๊ณ„๋ณ„๋กœ ์ตœ์ ํ™”ํ•˜๊ธฐ

 

DB ์—์„œ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ view ์—์„œ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” paging ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋“ค์˜ ์ง‘ํ•ฉ์„ page ๋ผ๋Š” ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๊ณ  page ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค

 

okky ์˜ pagination

 

์ด๋ฅผ data pagination ์ด๋ผ๊ณ  ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ํŽ˜์ด์ง• ์ „๋žต์€ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” 2๊ฐ€์ง€๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค

 

  1. ์˜คํ”„์…‹ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง•, offset based pagination
  2. ์ปค์„œ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง•, cursor based pagination

 

์ผ๋ฐ˜์ ์œผ๋กœ offset based pagination ์€ ๋Š๋ฆฌ๋‹ค๋Š” ๊ฒƒ์ด ์ž˜ ์•Œ๋ ค์ง„ ์‚ฌ์‹ค์ด๋‹ค.

 

์œ ๋ช…ํ•œ ๊ธ€๋กœ๋Š” ํ–ฅ๋กœ๋‹˜์˜ ํŽ˜์ด์ง• ์„ฑ๋Šฅ ๊ฐœ์„ ํ•˜๊ธฐ - No Offset ์‚ฌ์šฉํ•˜๊ธฐ ์—์„œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

offset based pagination ์€ ๋Š๋ฆฌ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ์™œ ๋Š๋ฆฌ๋‹ค๊ณ  ํ•˜๋Š”๊ฑธ๊นŒ?

 

์™œ offset ์—์„œ๋Š” limit ์ฟผ๋ฆฌ์˜ ์ด์ ์ด ์‚ฌ๋ผ์ง€๋Š”๊ฑธ๊นŒ?

 

์˜ค๋Š˜์€ ์˜คํ”„์…‹ ํŽ˜์ด์ง•์ด ๊ฐ€์ง€๋Š” ๋‹จ์ ์ด๋‚˜ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ๋ณด๋‹ค๋Š” ์™œ ๋Š๋ฆฐ์ง€์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ์›์ธ์„ ์ƒ๊ฐํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณผ ๊ฒƒ์ด๋‹ค

 

์ด๋ฒˆ ๊ธ€์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์•„๋ž˜ ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

  • offset based pagination ๊ณผ ๋ฌธ์ œ์ 
  • filesort vs index sort
  • streaming vs buffering

 

TL;DR

 

์ด๋ฒˆ ๊ธ€์˜ ํ•ต์‹ฌ์„ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  • offset based pagination
    • ์ •์˜
      • ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • page ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด offset ๋ถ€ํ„ฐ page ๋งŒํผ๋งŒ ์กฐํšŒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ๋ฌธ์ œ์ 
      • page ๊ฐ€ ๊นŠ์–ด์งˆ ์ˆ˜๋ก offset ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์กฐํšŒํ•˜๊ณ  page size ๋งŒํผ๋งŒ ๋ฐ˜ํ™˜
        • ๋งŒ์•ฝ offset ์ด 100๋งŒ์ด๊ณ  page size ๊ฐ€ 10 ์ด๋ผ๋ฉด, 1,000,010 ๊ฑด์„ ์‹ค์ œ๋กœ ์กฐํšŒ
          • ์กฐํšŒํ•  ๋•Œ Disk Random I/O ๊ฐ€ ๋‹ค๋Ÿ‰ ๋ฐœ์ƒ -> ๋Š๋ฆผ์˜ ๊ทผ๋ณธ์ ์ธ ์›์ธ
        • 0๋ฒˆ offset ๋ถ€ํ„ฐ ์‹œ์ž‘ offset ๊นŒ์ง€์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ฒ„๋ ค์ง€๊ณ  10๊ฑด๋งŒ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋จ
  • offset based pagination ์ด ๋Š๋ฆฐ ์ด์œ 
    • ๋ฌธ์ œ๋Š” ์ •๋ ฌ ๋ฐฉ์‹์— ์žˆ์Œ
      • ์ •๋ ฌ์„ ์œ„ํ•ด ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ streaming ์ด ์•„๋‹Œ buffering ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜
    • streaming vs buffering
      • streaming: ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ฆ‰์‹œ client ์—๊ฒŒ ๋ฐ˜ํ™˜
        • LIMIT ๊ตฌ๋ฌธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์ด์  ์กด์žฌ
      • buffering: ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•˜๋‹ค๊ฐ€ client ์—๊ฒŒ ๋ฐ˜ํ™˜
        • ORDER BY ๊ตฌ๋ฌธ์ด ์กด์žฌํ•˜๋ฉด ํ•ด๋‹น ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ
      • ์ด ๊ณผ์ •์—์„œ ๋‹ค๋Ÿ‰์˜ Random I/O ๊ฐ€ ๋ฐœ์ƒ
    • filesort ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ๋„ ๋ฌธ์ œ์˜ ์›์ธ์ด๊ธฐ๋„ ํ•จ
  • ๋ชจ๋“  offset based pagination ์ด ๋Š๋ฆฐ๊ฐ€?
    • ๊ทธ๋ ‡์ง€ ์•Š์Œ
    • page ๊นŠ์ด ๋ฌธ์ œ๋Š” ๋™์ผํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์ƒ ์ด์ ์„ ๋ณด์ด๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌ
    • filesort ๋Œ€์‹  index sort ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ
      • filesort: ์ •๋ ฌ ๊ธฐ์ค€์— index column ์ด ์กด์žฌํ•˜์ง€ ์•Š๋‹ค๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์ •๋ ฌ ์ž‘์—… ์ˆ˜ํ–‰ -> ๋Š๋ฆผ
      • index sort: ์ •๋ ฌ ๊ธฐ์ค€์— index column ์ด ์กด์žฌํ•  ๋•Œ ์ •๋ ฌ ์ž‘์—…์„ ์•ˆํ•จ -> ๋น ๋ฆ„

์˜คํ”„์…‹ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง•, offset based pagination ์ด ๋ญ˜๊นŒ? ๋น ๋ฅด๊ฒŒ ์•Œ์•„๋ณด์ž

 

์ด ๊ธ€์˜ ๋ชฉ์ ์€ offset based pagination ์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์— ์žˆ์ง€ ์•Š๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋ฅผ ๊ณต๊ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” offset based pagination ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•˜๋ฏ€๋กœ ํ•ต์‹ฌ๋งŒ ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž.

 

 

offset based pagination ์€ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • page ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด offset ๋ถ€ํ„ฐ page ๋งŒํผ๋งŒ ์กฐํšŒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค

 

MySQL ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์˜คํ”„์…‹ ํŽ˜์ด์ง•์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

SELECT * FROM ํ…Œ์ด๋ธ”_์ด๋ฆ„
LIMIT ์˜คํ”„์…‹_๊ฐ’, ํŽ˜์ด์ง€_์‚ฌ์ด์ฆˆ;

 

๊ทธ๋Ÿผ ์˜คํ”„์…‹_๊ฐ’ ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ํŽ˜์ด์ง€_์‚ฌ์ด์ฆˆ ๋งŒํผ ์กฐํšŒ๋ฅผ ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋‹ค

 

์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž

 

๊ฒŒ์‹œํŒ์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ฒŒ์‹œ๊ธ€ id ๋Š” 1 ๋ถ€ํ„ฐ id ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค

 

-- ex1. 0๋ฒˆ์งธ ์˜คํ”„์…‹๋ถ€ํ„ฐ 4๊ฐœ ์กฐํšŒ-> 1, 2, 3, 4 ์กฐํšŒ
SELECT id FROM users as u
LIMIT 1, 4;

-- ex2. 1๋ฒˆ์งธ ์˜คํ”„์…‹๋ถ€ํ„ฐ 4๊ฐœ ์กฐํšŒ -> 3, 4, 5, 6 ์กฐํšŒ
SELECT id FROM users as u
LIMIT 3, 4;

-- ex3. 3,457๋ฒˆ์งธ ์˜คํ”„์…‹๋ถ€ํ„ฐ 4๊ฐœ ์กฐํšŒ -> 3,457, 3,458, 3,459, 3,460 ์กฐํšŒ
SELECT id FROM users as u
LIMIT 3457, 4;

 

์˜ˆ์ œ์˜ ๋งˆ์ง€๋ง‰ ์ฟผ๋ฆฌ๋งŒ ๋ณด๋ฉด ์œ ์ €๋Š” 3457 ํŽ˜์ด์ง€๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ, 3,457, 3,458, 3,459, 3,460 ๊ธ€์„ ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๋“ฏ ์ฟผ๋ฆฌ๊ฐ€ ๋งค์šฐ ๋‹จ์ˆœํ•ด์„œ ์‰ฝ๊ฒŒ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง• ๊ธฐ๋ฒ•์ด๋‹ค


offset based pagination ์ด ๋Š๋ฆฌ๋‹ค?

 

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ์—๋„ ์‰ฝ๊ณ  ์ง๊ด€์ ์ธ ์˜คํ”„์…‹ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง•์€ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์žˆ๋‹ค๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ›์•„๋“ค์—ฌ์ง€๋Š” ์‚ฌ์‹ค์ด๋‹ค.

 

Chat GPT ํ•œํ…Œ ์™œ offset based paging ์ด ๋Š๋ฆฐ์ง€ ๋ฌผ์–ด๋ณด์ž

 

 

GPT ์˜ ๋ง์„ ์š”์•ฝํ•˜๋ฉด ์ด๋ ‡๋‹ค

 

  • ์˜คํ”„์…‹ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง•์€ ๋Š๋ฆฌ๋‹ค
  • ํŠน์ • ์˜คํ”„์…‹์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น ์˜คํ”„์…‹๊นŒ์ง€ ๊ฒฐ๊ณผ๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด์•ผ ํ•œ๋‹ค
  • ํฐ ์˜คํ”„์…‹์ผ ๊ฒฝ์šฐ ์„ ํ˜•์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค

 

๋Š๋ฆฐ ์ด์œ 1. ์˜คํ”„์…‹ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง•์€ ๋Š๋ฆฌ๋‹ค.

 

์šฐ์„  ๋Š๋ฆฌ๋‹ค๋ผ๋Š” ๊ฒƒ์ด ์™œ ๋Š๋ฆฐ์ง€, ๋ฌด์—‡์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š”์ง€ ์ดํ•ดํ•ด์•ผํ•œ๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์€ Disk I/O ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋ฌด๋ฆฌ ํฌ๊ณ  CPU ์—ฐ์‚ฐ ์„ฑ๋Šฅ์ด ์•„๋ฌด๋ฆฌ ๋›ฐ์–ด๋‚˜๋„ ๋ฌผ๋ฆฌ์ ์ธ Disk head ๋ฅผ ์›€์ง์ด๋ฉฐ ๋ณด์กฐ๊ธฐ์–ต์žฅ์น˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ–‰์œ„๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ณ  ๋น„์‹ผ ์ž‘์—…์ค‘ ํ•˜๋‚˜์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ index ๋ฅผ ์‚ฌ์šฉํ•ด Disk head ๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์›€์ง์ด๋Š” Random I/O ๋ฅผ Sequential I/O ๋กœ ๋งŒ๋“œ๋Š”๊ฒƒ์ด ํ•ต์‹ฌ์ด๋ผ๊ณ  ํ•˜๋Š”๊ฒƒ๋„ ๋‹ค ๊ทธ๋Ÿฐ ์ด์œ ์ด๋‹ค.

 

๋Š๋ฆฐ ์ด์œ 2. ํŠน์ • ์˜คํ”„์…‹์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น ์˜คํ”„์…‹๊นŒ์ง€ ๊ฒฐ๊ณผ๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด์•ผ ํ•œ๋‹ค

 

์—ฌ๊ธฐ์„œ๋Š” ๊ฑด๋„ˆ๋›ฐ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ offset ๋งŒํผ ์กฐํšŒํ•˜๊ณ  ๋ฒ„๋ฆฌ๊ธฐ(discard) ๋•Œ๋ฌธ์ด๋‹ค.

 

OFFSET ์— ์ง€์ •๋œ ๊ฐฏ์ˆ˜๋ถ€ํ„ฐ LIMIT ์ธ page size ๋งŒํผ๋งŒ ์กฐํšŒํ•  ๊ฒƒ์ด๋ผ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

 

0๋ฒˆ OFFSET ๋ถ€ํ„ฐ ์ง€์ •๋œ OFFSET ๊นŒ์ง€ ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

์ฆ‰, ์†๋„๊ฐ€ ๋Š๋ ค์ง€๋Š” ์ฃผ ์›์ธ์ธ Disk I/O ๊ฐ€ offset ๋งŒํผ ๋‹ค ์ผ์–ด๋‚˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„๋ฆฐ๋‹ค

 

๋Š๋ฆฐ ์ด์œ 3. ํฐ ์˜คํ”„์…‹์ผ ๊ฒฝ์šฐ ์„ ํ˜•์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค

 

์•ž์„  ๋ง์„ ์ด์–ด์„œ ํ•˜์ž๋ฉด ์˜คํ”„์…‹์ด ๋†’์•„์งˆ์ˆ˜๋ก, ์ฆ‰ ํŽ˜์ด์ง€๊ฐ€ ๊นŠ์–ด์งˆ ์ˆ˜๋ก ๊ทธ ๋งŒํผ ์กฐํšŒํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ o(n) ์ด๊ธฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๊ฐ€ ๊ทธ๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค

 

๊ทธ๋Ÿผ offset ๋งŒํผ์˜ Disk I/O ๊ฐ€ ๋Š˜์–ด๋‚  ๊ฒƒ์ด๊ณ  ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์„ ํ˜•๋งŒํผ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค

 

์™œ offset based pagination ์ด ๋Š๋ฆด๊นŒ?

 

offset based pagination ์ด ๋Š๋ฆฌ๊ฒŒ ๋˜๋Š” ์ฃผ๋œ ์›์ธ์€ ๋ฐ”๋กœ ORDER BY ์— ์žˆ๋‹ค.

 

์ด ๋ง์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” RDBMS(MySQL) ์—์„œ ๋ฐ์ดํ„ฐ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.

 

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ๋ฐฉ๋ฒ• 2๊ฐ€์ง€

 

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค

 

  1. streaming ์ฒ˜๋ฆฌ
  2. buffering ์ฒ˜๋ฆฌ

 

1. streaming ์ฒ˜๋ฆฌ

 

streaming ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ์–‘์— ๊ด€๊ณ„ ์—†์ด ์ฟผ๋ฆฌ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ฐพ์•„์งˆ ๊ฒฝ์šฐ ๋ฐ”๋กœ๋ฐ”๋กœ client ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค

 

client ์ž…์žฅ์—์„œ๋Š” ์–ธ์ œ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋ ์ง€๋Š” ๋ชจ๋ฅด์ง€๋งŒ ์šฐ์„ ์€ ์ฒซ๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ด ๋•Œ, LIMIT ๊ตฌ๋ฌธ์ด ์ถ”๊ฐ€๋˜๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์ ธ์™€์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ์ค„๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋„์›€์ด ๋œ๋‹ค

 

2. buffering ์ฒ˜๋ฆฌ

 

์ด์™€ ๋ฐ˜๋Œ€๋กœ buffering ๋ฐฉ์‹์€ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ๋ชจ์•„๋†จ๋‹ค๊ฐ€ client ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค

 

๊ทธ๋ž˜์„œ client ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 

๋ณดํ†ต ORDER BY ๋‚˜ GROUP BY ๊ตฌ๋ฌธ์ด ์ถ”๊ฐ€๋˜๋ฉด buffering ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š”๋ฐ, ๊ฒฐ๊ณผ๋“ค์„ ๋ชจ๋‘ ๋ชจ์•„๋†“๊ณ  ์ •๋ ฌ์ด๋‚˜ grouping ์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

 

paging ์€ ๋Œ€๋ถ€๋ถ„ ์ตœ์‹ ์ˆœ, ์ˆ˜์ •์ˆœ, ํŠน์ • ์ƒํƒœ๋ณ„๋กœ ์ •๋ ฌ(ORDER BY)์„ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— buffering ๋ฐฉ์‹์ด ์ ์šฉ๋œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ž˜์„œ streaming ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋  ๋•Œ LIMIT ์„ ํ†ตํ•œ ์„ฑ๋Šฅ์ƒ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 


๋ชจ๋“  offset based pagination ์ด ๋Š๋ฆด๊นŒ?

 

๋‹น์—ฐํžˆ๋„ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

 

offset based pagination ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜๊ณ  ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด page ๊ฐ€ ๊นŠ์–ด์งˆ ๋•Œ ์„ฑ๋Šฅ์ด ํ•˜๋ฝํ•˜๋Š” ๋ฌธ์ œ๋„ ์–ด๋Š์ •๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์•„๋ž˜ ๋‘ ์ฟผ๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ ๋ด๋ณด์ž

 

-- 1๋ฒˆ ์ฟผ๋ฆฌ
SELECT * FROM simple_todos
ORDER BY createdAt, title
LIMIT 700000, 3

-- 2๋ฒˆ ์ฟผ๋ฆฌ
SELECT * FROM simple_todos
ORDER BY id
LIMIT 700000, 3

 

์ด ๋‘ ์ฟผ๋ฆฌ๋Š” ์•ฝ 70๋งŒ๊ฑด์˜ ๋ฐ์ดํ„ฐ์—์„œ offset paging ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค.

 

์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด์ž

page ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๊นŠ๊ณ  ์„ฑ๋Šฅ ํ•˜๋ฝ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ด๋Š”๋ฐ, ๋‘ ์ฟผ๋ฆฌ๋Š” ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ฑฐ์˜ 24๋ฐฐ์— ๋‹ฌํ•œ๋‹ค.

 

์™œ ๋‘ ์ฟผ๋ฆฌ๊ฐ„ ์†๋„ ์ฐจ์ด๊ฐ€ ์ €๋ ‡๊ฒŒ ์‹ฌํ• ๊นŒ?

 

์ด์— ๋Œ€ํ•œ ๋‹ต์€ DBMS ๊ฐ€ ์ •๋ ฌ, ORDER BY ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์žˆ๋‹ค.

 

์ด ๊ฒƒ์„ ์ดํ•ดํ•œ๋‹ค๋ฉด offset based pagination ์ตœ์ ํ™”์— ๋Œ€ํ•ด์„œ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•œ 2๊ฐ€์ง€ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

 

๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹ค์Œ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋œ๋‹ค

 

  1. index sort
  2. filesort

 

1. index sort

 

index sort ๋Š” ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์ €์žฅํ•˜๋Š” index ์˜ ํŠน์„ฑ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

ORDER BY ๊ตฌ๋ฌธ์— index ๋กœ ์ง€์ •๋œ column ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฏธ๋ฆฌ ์ •๋ ฌ๋œ ์ธ๋ฑ์Šค์˜ ํŠน์„ฑ์„ ์ด์šฉํ•ด์„œ ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค

 

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ ฌ์„ ์œ„ํ•œ ์ž„์‹œ file ์ƒ์„ฑ ๋ฐ multiple merge ๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ์ž‘์—… ์—†์ด ์ •๋ ฌ๋œ index ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๊ฐ€์žฅ ๋น ๋ฅธ ์†๋„๋ฅผ ์ž๋ž‘ํ•œ๋‹ค

 

2. filesort

 

filesort ๋Š” ์ •๋ ฌ์„ ์œ„ํ•ด ๋””์Šคํฌ๋‚˜ ์ž„์‹œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.

 

์ฃผ๋กœ index sort ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•œ๋‹ค

 

  • ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— sort buffer ๋ฅผ ์ƒ์„ฑ(ํ• ๋‹น๋ฐ›์Œ)
    • sort buffer ์—์„œ ์ •๋ ฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ธ”๋ก ๋‹จ์œ„๋กœ ๋‚˜๋ˆ”
    • ๋ธ”๋ก ๋‚ด์˜ ์ •๋ ฌ ๊ฒฐ๊ณผ๋ฅผ file ํ˜•ํƒœ๋กœ ์ž„์‹œ ์ €์žฅ
      • ์ถ”๊ฐ€์ ์ธ Disk I/O ๋ฐœ์ƒ
  • ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๋“ค์„ ๋ณ‘ํ•ฉํ›„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    • multi-merge ์ž‘์—… ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

 

๊ทธ๋ƒฅ ๋ณด๊ธฐ์—๋„ ์ •๋ง ๋งŽ์€ ์ž‘์—…์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ๋„ filesort ๊ฐ€ index sort ๋ณด๋‹ค ํ›จ์”ฌ ๋Š๋ฆฌ๋‹ค.

 

๋น„๊ต

 

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์•Œ์•„ํ•  ์ง€์‹๋“ค์€ ๋‹ค ์ด์•ผ๊ธฐํ–ˆ๋‹ค! ์‹คํ–‰ ๊ณ„ํš์„ ํ†ตํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„์„ํ•ด๋ณด์ž

 

 

์‹คํ–‰ ๊ณ„ํš์„ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋Š” ์ด๋ ‡๋‹ค

 

  • ๋‘ ์ฟผ๋ฆฌ ๋ชจ๋‘ ORDER BY ์ฟผ๋ฆฌ๊ฐ€ ์ ์šฉ๋˜์–ด streaming ๋ฐฉ์‹์ด buffering ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋จ
    • ๊ฒฐ๊ณผ set ์ด ๋ชจ๋‘ ๋ชจ์ผ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐํ•จ
  • ์ฒซ๋ฒˆ์งธ ์ฟผ๋ฆฌ
    • ์ •๋ ฌ ์กฐ๊ฑด์—์„œ index ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ -> filesort ์‚ฌ์šฉ
  • ๋‘๋ฒˆ์งธ ์ฟผ๋ฆฌ
    • ์ •๋ ฌ ์กฐ๊ฑด์— index column ์ด ์กด์žฌํ•จ -> index sort ์‚ฌ์šฉ

 

๊ฒฐ๊ตญ ์ •๋ ฌ์„ ํ•  ๋•Œ index ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š๋ƒ ๋งˆ๋Š๋ƒ๊ฐ€ ๋‘ ์ฟผ๋ฆฌ๊ฐ„์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ •๋ฆฌ

 

์ด๋ฒˆ์—๋Š” offset based pagination ์ด ๋Š๋ฆฐ ์ด์œ ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.

 

๊ทธ ์ด์œ ๋“ค์„ ์ •๋ฆฌํ•˜์ž๋ฉด ์ด๋ ‡๋‹ค

 

  • ๋Š๋ฆฐ ์ด์œ  1. ORDER BY ๊ตฌ๋ฌธ์— ์˜ํ•ด streaming ๋ฐฉ์‹์—์„œ buffering ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋จ
    • ๊ทธ์— ๋”ฐ๋ผ LIMIT ์ฟผ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋”๋ผ๋„ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ
  • ๋Š๋ฆฐ ์ด์œ  2. ์ •๋ ฌ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด offset ๋งŒํผ Disk I/O ๊ฐ€ ๋ฐœ์ƒ
    • ํŠน์ • ์ผ€์ด์Šค์—์„œ ์œ„์˜ I/O ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋น„์‹ผ Random I/O ์œ ๋ฐœ
  • ๋Š๋ฆฐ ์ด์œ  3. filesort ๊ฐ€ ์‚ฌ์šฉ๋จ
    • ์ •๋ ฌ์„ ์œ„ํ•œ sort buffer ํ• ๋‹น
    • ๋ฐ์ดํ„ฐ๋“ค์„ ํŠน์ • ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๊ณ  ์ •๋ ฌ์„ ์ˆ˜ํ–‰ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋””์Šคํฌ์— ์ž„์‹œ ์ €์žฅ
    • ์ •๋ ฌ๋œ ์ž„์‹œ ํŒŒ์ผ๋“ค์„ ๋ณ‘ํ•ฉ(mutiple merge) ํ•˜์—ฌ ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

 

ํ˜น์ž๋Š” ์ด๋Ÿฐ ์ด์•ผ๊ธฐ๋ฅผ ํ•œ๋‹ค.

 

"๊ผญ offset based paging ์„ ํ•ด์•ผํ•˜๋‚˜์š”? cursor based paging ์„ ํ•˜๋ฉด ์•ˆ๋ผ์š”?"

 

๋งž๋Š” ๋ง์ด๋‹ค. ํŽ˜์ด์Šค๋ถ์—์„œ๋„ ๊ฐ€๋Šฅํ•œ ํ•ญ์ƒ cursor based pagination ์ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ•์กฐํ•œ๋‹ค.

 

 

ํ•˜์ง€๋งŒ ์–ด๋– ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์—์„œ๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿด ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋‹ค์Œ์—๋Š” ์˜คํ”„์…‹ ํŽ˜์ด์ง• ๋‹จ๊ณ„๋ณ„๋กœ ์ตœ์ ํ™”ํ•˜๊ธฐ ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

 

์˜คํ”„์…‹ ํŽ˜์ด์ง•, ๋‹จ๊ณ„๋ณ„๋กœ ์ตœ์ ํ™”ํ•˜๊ธฐ

์ด ๊ธ€์€ offset based pagination ์„ ๋นŒ๋ฏธ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‚ด๋ถ€ ๋™์ž‘๊ณผ ์—ฌ๋Ÿฌ ๊ฐœ๋…๋“ค์„ ์•Œ์•„๋ณด๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. 2๊ฐœ์˜ ๊ธ€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , ๊ฐ๊ฐ์˜ ๊ธ€์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” insight ๊ฐ€ ๋‹ค๋ฅด๋‹ˆ ํ•จ๊ป˜ ์ฝ์œผ๋ฉด ๋”์šฑ

wonit.tistory.com

 

๋Œ“๊ธ€