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๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚จ.
    • ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํšจ์œจ์ ์ธ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ.