โ๐พ[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๋ณด๋ค ์ฑ๋ฅ์ด ๋ฐ์ด๋จ.
- ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ํจ์จ์ ์ธ ๊ฒ์ ๊ฐ๋ฅ.