์คํ์ ํ์ด์ง์ด ๋๋ฆฐ ์ง์ง ์ด์
์ด ๊ธ์ offset based pagination ์ ๋น๋ฏธ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ด๋ถ ๋์๊ณผ ์ฌ๋ฌ ๊ฐ๋ ๋ค์ ์์๋ณด๋ ๊ธ ์ ๋๋ค.
2๊ฐ์ ๊ธ๋ก ๊ตฌ์ฑ๋์ด ์๊ณ , ๊ฐ๊ฐ์ ๊ธ์์ ์ป์ ์ ์๋ insight ๊ฐ ๋ค๋ฅด๋ ํจ๊ป ์ฝ์ผ๋ฉด ๋์ฑ ์ ์ตํฉ๋๋ค.
- ์คํ์ ํ์ด์ง์ด ๋๋ฆฐ ์ง์ง ์ด์ <- ํ์ฌ ๊ธ
- ์คํ์ ํ์ด์ง, ๋จ๊ณ๋ณ๋ก ์ต์ ํํ๊ธฐ
DB ์์ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ view ์์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ paging ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
๊ณ ์ ๋ ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ค์ ์งํฉ์ page ๋ผ๋ ๋จ์๋ก ๋๋๊ณ page ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ง ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ ํํ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค
์ด๋ฅผ data pagination ์ด๋ผ๊ณ ํ๊ณ ์ด๋ฌํ ํ์ด์ง ์ ๋ต์ ์ผ๋ฐ์ ์ผ๋ก๋ 2๊ฐ์ง๊ฐ ์ฌ์ฉ๋๋ค
- ์คํ์ ๊ธฐ๋ฐ ํ์ด์ง, offset based pagination
- ์ปค์ ๊ธฐ๋ฐ ํ์ด์ง, 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 ์ด 100๋ง์ด๊ณ page size ๊ฐ 10 ์ด๋ผ๋ฉด, 1,000,010 ๊ฑด์ ์ค์ ๋ก ์กฐํ
- page ๊ฐ ๊น์ด์ง ์๋ก offset ๊น์ง ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์กฐํํ๊ณ page size ๋งํผ๋ง ๋ฐํ
- ์ ์
- offset based pagination ์ด ๋๋ฆฐ ์ด์
- ๋ฌธ์ ๋ ์ ๋ ฌ ๋ฐฉ์์ ์์
- ์ ๋ ฌ์ ์ํด ๊ฒฐ๊ณผ ์ฒ๋ฆฌ๋ฅผ streaming ์ด ์๋ buffering ๋ฐฉ์์ผ๋ก ์ ํ
- streaming vs buffering
- streaming: ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ client ์๊ฒ ๋ฐํ
- LIMIT ๊ตฌ๋ฌธ๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ์ด์ ์กด์ฌ
- buffering: ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์๋ค๊ฐ client ์๊ฒ ๋ฐํ
- ORDER BY ๊ตฌ๋ฌธ์ด ์กด์ฌํ๋ฉด ํด๋น ๋ฐฉ์์ผ๋ก ์ฌ์ฉ
- ์ด ๊ณผ์ ์์ ๋ค๋์ Random I/O ๊ฐ ๋ฐ์
- streaming: ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ client ์๊ฒ ๋ฐํ
- 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๊ฐ์ง๋ก ๋๋๊ฒ ๋๋ค
- streaming ์ฒ๋ฆฌ
- 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๊ฐ์ง ๋ฐฉ๋ฒ์ด ์ฌ์ฉ๋๋ค
- index sort
- 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 ๋ฐ์
- ๋ธ๋ก ๋ด์ ์ ๋ ฌ ๊ฒฐ๊ณผ๋ฅผ file ํํ๋ก ์์ ์ ์ฅ
- ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ค์ ๋ณํฉํ ๊ฒฐ๊ณผ ๋ฐํ
- 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 ์ด ์ฌ์ฉ๋์ด์ผ ํ๋ค๊ณ ๊ฐ์กฐํ๋ค.
ํ์ง๋ง ์ด๋ ํ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์์๋ ๋ค๋ฅผ ์ ์๋ค.
๊ทธ๋ด ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ๋ค์์๋ ์คํ์ ํ์ด์ง ๋จ๊ณ๋ณ๋ก ์ต์ ํํ๊ธฐ ์ ๋ํด์ ์์๋ณผ ๊ฒ์ด๋ค.