์ด ๊ธ์ offset based pagination ์ ๋น๋ฏธ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ด๋ถ ๋์๊ณผ ์ฌ๋ฌ ๊ฐ๋ ๋ค์ ์์๋ณด๋ ๊ธ ์ ๋๋ค.
2๊ฐ์ ๊ธ๋ก ๊ตฌ์ฑ๋์ด ์๊ณ , ๊ฐ๊ฐ์ ๊ธ์์ ์ป์ ์ ์๋ insight ๊ฐ ๋ค๋ฅด๋ ํจ๊ป ์ฝ์ผ๋ฉด ๋์ฑ ์ ์ตํฉ๋๋ค.
- ์คํ์ ํ์ด์ง์ด ๋๋ฆฐ ์ง์ง ์ด์
- ์คํ์ ํ์ด์ง, ๋จ๊ณ๋ณ๋ก ์ต์ ํํ๊ธฐ <- ํ์ฌ ๊ธ
์ง๋ ์๊ฐ, ์ฐ๋ฆฌ๋ ์คํ์ ํ์ด์ง์ด ๋๋ฆฐ ์ง์ง ์ด์ ์ ๋ํด์ ์์๋ณด์๋ค.
offset based pagination ์ ๋ณด๊ณ ๋๊ตฐ๊ฐ๋ ์ด๋ฐ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค.
"๊ผญ offset based paging ์ ํด์ผํ๋์? cursor based paging ์ ํ๋ฉด ์๋ผ์?"
๋ง๋ ๋ง์ด๋ค. ํ์ด์ค๋ถ์์๋ ๊ฐ๋ฅํ ํญ์ cursor based pagination ์ด ์ฌ์ฉ๋์ด์ผ ํ๋ค๊ณ ๊ฐ์กฐํ๋ค.
ํ์ง๋ง ์ด๋ ํ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์์๋ ๋ค๋ฅผ ์ ์๋ค.
offset based paging ์ ์ฌ์ฉํ์ง ์๋๊ฒ์ด ์ข์ผ๋ ํญ์ ๊ทธ๋ด์ ์๋ค.
์ด๋ค ์ํฉ์์๋ no offset ์ ์ฌ์ฉํ ์ ์์ ์ ์๋ค
- ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ด no offset ์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ
- WHERE ์กฐ๊ฑด์ด ์ค๋ณต๋์ด cursor ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ
๊ทธ๋์ ์ฐ๋ฆฌ๋ offset based pagaing ์ ์ ์ฐ๋ ๋ฒ๋ ์์์ผํ๋๋ฐ, ์ด์ ๋ํด์ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ๋ ๋ค๊ณผ ํจ๊ป ์ดํดํด๋ณด๋๋ก ํ์
์ด๋ฒ ๊ธ์ ํตํด ์ฌ๋ฌ๋ถ๋ค์ ์๋ ํค์๋์ ๋ํด์ ์์๊ฐ ์ ์์ ๊ฒ์ด๋ค.
- deferred join
- composite index, concaternate index
- using filesort vs using index sort
- covering index
TL;DR
์ด๋ฒ ๊ธ์ ํต์ฌ์ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- offset based pagination ์ต์ ํ
- deferred join: buffering ๋ฐฉ์์ ์ด์ฉ ์ ์๋ ๋ฐ์ดํฐ ๋ฒ๋ ค์ง(discard)์ ์ต์ํํ์
- covering index: ๋ถํ์ํ Disk I/O ๋ฅผ ์ค์ด์
- composite index: filesort ๋ฅผ index sort ๋ก ๋ฐ๊พธ์
offset based pagination ์ต์ ํ ํ๊ธฐ
์ต์ ํ์ ์์, ์ง๋ ์๊ฐ offset based pagination ์ด ๋๋ฆฐ ์ด์ ์ ๋ํด์ ๋ค์ ํ ๋ฒ ์๊ธฐํด๋ณด์
- ๋๋ฆฐ ์ด์ 1. ORDER BY ๊ตฌ๋ฌธ์ ์ํด streaming ๋ฐฉ์์์ buffering ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋จ
- ๊ทธ์ ๋ฐ๋ผ LIMIT ์ฟผ๋ฆฌ๊ฐ ์กด์ฌํ๋๋ผ๋ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฒ ๋จ
- ๋๋ฆฐ ์ด์ 2. ์ ๋ ฌ์ ์ํด ํ์ํ ๋ฐ์ดํฐ๋ค์ ๊ฐ์ ธ์ค๊ธฐ ์ํด offset ๋งํผ Disk I/O ๊ฐ ๋ฐ์
- ํน์ ์ผ์ด์ค์์ ์์ I/O ๋ index ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น์ผ Random I/O ์ ๋ฐ
- ๋๋ฆฐ ์ด์ 3. filesort ๊ฐ ์ฌ์ฉ๋จ
- ์ ๋ ฌ์ ์ํ sort buffer ํ ๋น
- ๋ฐ์ดํฐ๋ค์ ํน์ ๋จ์๋ก ๋๋๊ณ ์ ๋ ฌ์ ์ํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋์คํฌ์ ์์ ์ ์ฅ
- ์ ๋ ฌ๋ ์์ ํ์ผ๋ค์ ๋ณํฉ(mutiple merge) ํ์ฌ ๊ฒฐ๊ณผ ํ ์ด๋ธ ์์ฑ
์ ์ด์ ๋ค ์ค 1๋ฒ์ ํด๊ฒฐํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ผ ๊ฒ์ด๋ค.
๊ทธ ์๋์ 2๊ฐ์ง ๋๋ฆฐ ์ด์ ๋ฅผ ํ๋์ฉ ์ ๊ฑฐํ๋ฉด์ ์ฑ๋ฅ์ ๋์ด์ฌ๋ ค๋ณด์
์ต์ ํ 1๋จ๊ณ. deferred join ์ ์ด์ฉํ๋ผ
์ฒซ๋ฒ์งธ๋ก ์ ์ฉํ ์ต์ ํ๋ ๋ฐ๋ก deferred join ์ด๋ผ๋ ๊ธฐ๋ฒ์ด๋ค
deferred ๋ผ๋ ๋ป์ postponed, delay ์ผ๋ก ์ง์ฐ์ํค๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
deferred join ์ ์ผ์ข ์ lazy loading ์ ์ํํ๋ ๊ฒ์ด๋ค.
ํต์ฌ์ OFFSET ๊ตฌ๋ฌธ์ผ๋ก ์ธํด ๊ทธ ๋งํผ Disk ์ I/O ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ง์ ์ ์์ง๋ง, ๋์ ๋ฒ๋ ค์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ด๋ ๊ฒ์ด๋ค.
๋ฒ๋ ค์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ฌ์ ๋ฉ๋ชจ๋ฆฌ์์ (buffer pool) ์ฒ๋ฆฌ๋๋ ๋ฐ์ดํฐ์ ์ฌ์ด์ฆ๋ฅผ ์ค์ด๋ ๊ฒ์ด๋ค
์ด๋ป๊ฒ ํ ๊น?
- ์ ๋ ฌ์ ์ํํด์ผ ํ๋ OFFSET ๊ตฌ๋ฌธ์ sub query ๋ก ๋ง๋ ๋ค.
- ์์ ๊ฒฐ๊ณผ๋ก ์กฐํ๋ id ๋ฅผ ์๋ ํ ์ด๋ธ๊ณผ join ํ๋ค.
์ด ๊ณผ์ ์ ๊ฑฐ์น๋ฉด, ๋ค๋์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ OFFSET ์ฟผ๋ฆฌ์์ id ๋ง ์กฐํํ๊ฒ ๋๊ณ , ์๋ ํ ์ด๋ธ๊ณผ join ์ ํ์ฌ ์ ์ฒด ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๊ฒ ๋๋ค.
deferred join - ๊ตฌํ ๋ฐฉ๋ฒ
SELECT *
FROM ํ
์ด๋ธ๋ช
ORDER BY ์ ๋ ฌ_์กฐ๊ฑด
LIMIT ์คํ์
_๊ฐ, ํ์ด์ง_์ฌ์ด์ฆ;
SELECT *
FROM ํ
์ด๋ธ๋ช
JOIN (/*์์ ์คํ์
์ฟผ๋ฆฌ ๋จ, id ๋ง ์กฐํํ๋ค*/) AS temp USING (id)
ORDER BY ์ ๋ ฌ_์กฐ๊ฑด;
์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ์์ SELECT * FROM..
์ด ์๋๋ผ SELECT id FROM..
์ผ๋ก ์์ ํ ์ฟผ๋ฆฌ๋ฅผ ๋๋ฒ์งธ ์ฟผ๋ฆฌ์ JOIN ์ sub query ๋ก ๋ฃ์ผ๋ฉด ๋๋ค.
๊ทธ๋ผ OFFSET LIMIT
์ด ์ ์ฉ๋ ๋ id ๋ง ์กฐํํ ๊ฒ์ด๊ณ , OFFSET ์ดํ ๋ฒ๋ ค์ง๋ ๋ฐ์ดํฐ๋ค๋ id ๋ง ๋ฒ๋ ค์ง๊ฒ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ค์ client ์๊ฒ ๋ฐํํด์ผํ๋ ๋ฐ์ดํฐ๋ค์ JOIN ์ธ๋ถ ์ฟผ๋ฆฌ์์ ์คํํ๋ ๊ฒ์ด๋ค
์์๋ฅผ ํตํด ์์๋ณด์
deferred join - ์์
์๋์ ์ฟผ๋ฆฌ๋ 170๋ง๊ฑด์ ๋ฐ์ดํฐ์ ์ ์ฉ๋ ์ผ๋ฐ์ ์ธ OFFSET ์ฟผ๋ฆฌ์ด๋ค.
SELECT *
FROM simple_todos AS todos
ORDER BY todos.createdAt,
todos.title
LIMIT 1700000, 10;
์ด ์ฟผ๋ฆฌ์์ SELECT ๋ค์ ๋์ค๋ *
๋๋ฌธ์ OFFSET ๋งํผ ๊ฐ์ ธ์ ์ ๋ ฌ์ ํ๋๋ฐ, ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ง์ด ์ก์๋จน๊ฒ ๋๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ deferred join ์ ์ฌ์ฉํ๋ค๋ฉด
SELECT *
FROM simple_todos AS todos
JOIN ( -- deferred join ์์
SELECT id -- id ๋ง ์กฐํ
FROM simple_todos
ORDER BY todos.createdAt, todos.title
LIMIT 1700000, 10
) AS temp USING (id) -- sub query ์ ๊ฒฐ๊ณผ๋ฅผ driving table id ๋ก join
ORDER BY todos.createdAt, todos.title; -- ์ฌ์ ๋ ฌ
๊ณผ ๊ฐ์ด๋ ์ ์๋ค
deferred join - ์ฑ๋ฅ ๋น๊ต
deferred join ์ ์ฌ์ฉํ ์ฟผ๋ฆฌ์ ๊ทธ๋ ์ง ์์ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์ฝ 1.6๋ฐฐ์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ๋ณด์๋ค.
์ ์๋ฏธํ ์ฑ๋ฅ์ ์ฐจ์ด๋ ํ์ธํ์ง๋ง ์์ง ๋ถ์กฑํ๋ค.
์ด ์ฟผ๋ฆฌ๋ 170๋ง ๊ฑด์ ๋ฐ์ดํฐ์ผ ๋ ์๋ฏธ๊ฐ ์์ง 10๋ง๊ฑด์ ์ ๋์ ๋ฐ์ดํฐ์์๋ ํฐ ์ฐจ์ด๊ฐ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฅ ๋ณต์กํ ์ฟผ๋ฆฌ๋ก๋ง ๋ณด์ผ ๋ฟ์ด๋ค.
๋ ๋์ ์์ค์ ์ต์ ํ๋ฅผ ํด๋ณด์
์ต์ ํ 2๋จ๊ณ. Random Disk I/O ๋ฅผ ์ค์ฌ๋ณด์
์ฌ์ค ์์ ๋ฌธ์ ์ค ๊ฐ์ฅ ํฐ ๋ฌธ์ , ์ฆ ๊ฐ์ฅ ๋๋ฆฐ ์์ ์ ๋น์ฐํ ๋ฐ์ดํฐ ๋ ์ฝ๋๋ฅผ ์กฐํํ ๋ ๋ฐ์ํ๋ Disk I/O (Random I/O) ์ผ ๊ฒ์ด๋ค.
์ด๋ป๊ฒ ํ๋ฉด Disk I/O ๋ฅผ ์ค์ผ ์ ์์๊น?
๋ต์ ๊ฐ๋จํ๋ค. ๋ฐ์ดํฐ ๋ ์ฝ๋๋ฅผ ์ํ Disk I/O ๋ฅผ ํ์ง ์๋๋ก ์ ๋ํ๋ฉด ๋๋ค
DB ์ ์คํ ์์ง์ด ๋ฐ์ดํฐ ๋ ์ฝ๋๋ฅผ ์กฐํํ๊ธฐ ์ํด Disk I/O ๋ฅผ ํ๊ธฐ ์ ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฅ์ด์ฃผ๋ฉด ๋๋ค.
- ORDER BY ์กฐ๊ฑด์
createdAt
์ด ์์ด์ ์ด์ฉ ์ ์์ด Disk ์ ์ ๊ทผํด์ผํ๋ค?- ๊ทธ๋ผ index ๋ฅผ ๊ฑธ์ด๋ฒ๋ฆฌ์.
- index ๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์๊ธฐ ๋๋ฌธ์ ๋ ์ฝ๋ ์ ์ฒด๋ฅผ ์กฐํํ๋ Disk I/O ๊ฐ ์ฌ๋ผ์ง ๊ฒ์ด๋ค
SELECT * FROM..
๋๋ฌธ์ ์ ์ฒด ๋ฐ์ดํฐ ์กฐํ๋ฅผ ์ํด Disk ์ ์ ๊ทผํด์ผํ๋ค?- ๊ทธ๋ผ
SELECT id FROM..
์ผ๋ก pk(id) ๋ง ์กฐํํ๋๋ก ํ์ - pk(id) ๋ ์๋์ผ๋ก ์์ฑ๋๋ index ์ด๊ธฐ ๋๋ฌธ์ index ์กฐํ์ ๋ชจ๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ค.
- ๋ฐ์ดํฐ ๋ ์ฝ๋ ์ ๊ทผ์ ์ํ Disk IO ๊ฐ ์์ด์ง ๊ฒ์ด๋ค
- ๊ทธ๋ผ
์ฌ์ค ์์์ ์ค๋ช ํ ๋ด์ฉ์ด ๋ฐ๋ก Covering Index ์ด๋ค.
Disk I/O ์ค์ด๊ธฐ - covering index
covering index ๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ํฌํจํ๋ index ๋ฅผ ์๋ฏธํ๋ค.
SELECT username
FROM users
WHERE username = '์ฅ์์ต'
ALTER TABLE users
ADD INDEX idx_name (username);
์์ ๊ฐ์ด index ๋ฅผ ๊ฑธ๊ณ index ์ ์ค์ ๋ column name ์ผ๋ก WHERE ์กฐ๊ฑด๊ณผ SELECT ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ์ฑํ๋ค๋ฉด Table Scan ์ด ์๋๋ผ Index Scan ์ผ๋ก ๋์ํ๊ฒ ๋ ๊ฒ์ด๋ค
๊ทธ๋ผ ๊ฒฐ๊ตญ ํน์ ๋ฐ์ดํฐ ์กฐํ๋ฅผ ์ํด ๋ฐ์ดํฐ ๋ ์ฝ๋๋ฅผ ์ง์ ์กฐํํ๋ Disk I/O ๊ฐ ์ฌ๋ผ์ง ๊ฒ์ด๋ค.
์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์ฌ ์ฑ๋ฅ์ ๋น๊ตํ๊ธฐ ์ ์ ์๋ ์ต์ ํ๋ฅผ ๋จผ์ ํ์ธํด๋ณด์.
์ต์ ํ 3 ๋จ๊ณ. filesort ๋ฅผ ์์ ์
filesort ๋ ์ญ์ ๋ณต์กํ๊ณ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ค ํ๋๋ก ๊ผฝํ๋ค.
filesort ๋ฅผ ์์ ๋ฉด ์ฑ๋ฅ ํฅ์์ด ์๋ช ํ๋ค!!
filesort ๋ฅผ ์์ ๊ธฐ - ์ฌ์ ์ง์
filesort ๋ฅผ ์์ ๊ธฐ ์ํด์๋ ์ฐ์ ๊ทธ๊ฒ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ๋์์ ๋ฌด์์ธ์ง ์์์ผ ํ๋ค.
filesort ์ index sort ์ ๋ํ ์ค๋ช ์ ์ง๋ ์คํ์ ํ์ด์ง์ด ๋๋ฆฐ ์ง์ง ์ด์ ์์ ์ธ๊ธํ์์ง๋ง ๊ฐ๋ตํ ์ ๋ฆฌํ์๋ฉด
- index sort
- ํญ์ ์ ๋ ฌ๋ ์ํ๋ก ์ ์ฅํ๋ index ์ ํน์ฑ์ ์ด์ฉํ๋ ๊ฒ
ORDER BY
๊ตฌ๋ฌธ์ index ๋ก ์ง์ ๋ column ์ด ์๋ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ์ ๋ ฌ๋ ์ธ๋ฑ์ค์ ํน์ฑ์ ์ด์ฉํด์ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ- ์ ๋ ฌ์ ์ํ ์์ file ์์ฑ ๋ฐ multiple merge ๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ์์ ์์
- ์ ๋ ฌ ์์ ์ค ๊ฐ์ฅ ๋น ๋ฅธ ์๋ ๋ณด์ฅ
- filesort
- filesort ๋ ์ ๋ ฌ์ ์ํด ๋์คํฌ๋ ์์ ํ์ผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- ์ฃผ๋ก index sort ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ์ผ์ ํ๋ค
- ๋ด๋ถ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌ๋๋ฏ๋ก ๋น๊ต์ ๋๋ฆผ
- ๋ด๋ถ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ sort buffer ๋ฅผ ์์ฑ(ํ ๋น๋ฐ์)
- sort buffer ์์ ์ ๋ ฌ ์ฐ์ฐ์ ์ํ
- ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก ๋จ์๋ก ๋๋
- ๋ธ๋ก ๋ด์ ์ ๋ ฌ ๊ฒฐ๊ณผ๋ฅผ file ํํ๋ก ์์ ์ ์ฅ
- ์ถ๊ฐ์ ์ธ Disk I/O ๋ฐ์
- ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ค์ ๋ณํฉํ ๊ฒฐ๊ณผ ๋ฐํ
- multi-merge ์์ ์ํํ์ฌ ๊ฒฐ๊ณผ ํ ์ด๋ธ ์์ฑ
- ๋ด๋ถ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ sort buffer ๋ฅผ ์์ฑ(ํ ๋น๋ฐ์)
filesort ๋ฅผ ์์ ๊ธฐ - ๋ณตํฉ ์ธ๋ฑ์ค ์ค์
filesort ๋ฅผ ์์ ๊ณ ์ตํฐ๋ง์ด์ ๊ฐ index sort ๋ฅผ ์ฌ์ฉํ๋๋ก ์ ๋ํ๊ธฐ ์ํด์๋ ORDER BY ์ ๋ค์ด๊ฐ๋ ์กฐ๊ฑด์ด ๋ชจ๋ index ๋ก ์ง์ ๋ column ์ด์ด์ผ ํ๋ค.
ORDER BY ์ ๋ค์ด๊ฐ๋ ์กฐ๊ฑด์ index ๋ก ํ๋ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค
select createdAt, content
from simple_todos as todos
order by createdAt, title
LIMIT 1700000, 10;
ALTER TABLE simple_todos
ADD INDEX idx_createdAt_title (createdAt, title);
๊ทธ๋ผ ์ ๋ ฌ ๊ณผ์ ์์ sort buffer ๋ temp file io ๋ฅผ ํตํ ์ ๋ ฌ์ด ์ฌ๋ผ์ง๊ณ ์ด๋ฏธ ์ ๋ ฌ๋ index ์์๋๋ก ๋ฐํ์ ํ๊ฒ๋ ๊ฒ์ด๋ค.
๋ณตํฉ ์ธ๋ฑ์ค ๋ฐ covering index ์ ์ฉ ํ ์ฑ๋ฅ ๋น๊ต
170๋ง๊ฑด์ ๋ฐ์ดํฐ๋ฅผ Ordering ํ์์ ๋์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ๋ด๋ณด์
์์ order by ์ ํด๋นํ๋ ์ ๋ ฌ ์กฐ๊ฑด์ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ๊ธฐ ์ ์ด๊ณ ๋ค๋ index ๋ฅผ ์ถ๊ฐํ ํ๋ค.
7,585ms ์์ 234ms ๋ก ์ฝ 32๋ฐฐ์ ์๋ ์ฐจ์ด๊ฐ ๋๋ค
๋ง์ง๋ง! ์ด ๋ชจ๋ ์ต์ ํ๋ฅผ ๋ค ์ ์ฉํด๋ณด์
์ต์ ํ ์ ์ฟผ๋ฆฌ
์๋์ ์ฟผ๋ฆฌ๋ ์ต์ ํ๋ฅผ ํ๊ธฐ ์ ์ ์ฟผ๋ฆฌ๋ค.
select *
from simple_todos as todos
order by createdAt, title
LIMIT 1700000, 10;
์ต์ ํ ํ ์ฟผ๋ฆฌ
์ต์ ํ๋ฅผ ๋ง์น ์ฟผ๋ฆฌ์ด๋ค.
SELECT *
FROM simple_todos AS todos
JOIN (SELECT id
FROM simple_todos
ORDER BY createdAt,
title
LIMIT 1700000, 10) AS temp USING (id)
ORDER BY todos.createdAt, todos.title;
ALTER TABLE simple_todos
ADD INDEX idx_createdAt_title (createdAt, title);
์ฐ๋ฆฌ๋ ์ด ์ต์ ํ๋ฅผ ์ํด ๊ฝค๋ ๋ง์ ๊ฒ์ ์ ์ฉํ์๋ค.
- buffering ๋ฐฉ์์ ์ด์ฉ ์ ์๋ ๋ฐ์ดํฐ ๋ฒ๋ ค์ง(discard) ๋ฅผ ์ํด deferred join ์ ์ ์ฉํ๋ค.
- ๋ถํ์ํ Disk I/O ๋ฅผ ์์ ๊ธฐ ์ํด covering index ๋ฅผ ์ ์ฉํ์๋ค
- filesort ๋ฅผ index sort ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ์ ๋ ฌ ์กฐ๊ฑด์ composite index ๋ฅผ ์ ์ฉํ์๋ค
๊ทธ ๊ฒฐ๊ณผ ๊ธฐ์กด ๋๋น ์ฝ 62๋ฐฐ ๋นจ๋ผ์ง ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์๋ค
์ด ์๋๋ ์๋ง ๋ฐ์ดํฐ ์์ด ๋ง์์ง ์๋ก, ํ์ด์ง๊ฐ ๊น์ด์ง์๋ก ๋ ๋์ด๋ ๊ฒ์ด๋ค.
๊ฒฐ๋ก
์ด๋ ๊ฒ ์ฌ๋ฌ๊ฐ์ง ์ฅ์น๋ฅผ ํด๋์์ง๋ง ๊ฒฐ๊ตญ ๊ฒ์ ์กฐ๊ฑด, ์ ๋ ฌ ์กฐ๊ฑด๋ง๋ค ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ๋๊ฒ์ ์ฌ์ค์ ๋งค์ฐ ์ด๋ ต๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์ ์ต์ ํ ์ฟผ๋ฆฌ๊ฐ ์ด๋ฌํ ์ง์์ด ์์ด ๋ณธ๋ค๋ฉด ๋งค์ฐ ๋ณต์กํ ์ฟผ๋ฆฌ๋ก ๋ณด์ผ ๊ฒ์ด๋ค.
์ด์ฉ ์ ์๋ ์ํฉ์ ์ ์ธํ๊ณ ๋ ๊ฐ๋ฅํ๋ค๋ฉด cursor ๊ธฐ๋ฐ ํ์ด์ง์ผ๋ก ๊ฐ๋ ๊ฒ๋ ์ข์ ์ ํ์ด๋ค.
์ด๋ ๊ฒ ์์ ๊ธ๊ณผ ์ด๋ฒ ๊ธ์ ํตํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ๋ฌ๊ฐ์ง ํค์๋์ ๊ธฐ์ ์ ๋ํด์ ์์๋ณด์๋ค.
๋ด์ฉ์ ๋งฅ๋ฝ์ ์งํค๊ธฐ ์ํด์ ์ฌ๋ฌ ํค์๋๋ค์ ๋ํด ์ ํ์ ์ผ๋ก ์ค๋ช ์ ํ๊ธฐ ๋๋ฌธ์ ๊ด๋ จํด์๋ ๋ ๊น๊ฒ ํ์ตํ๋ ๊ฒ์ ์ถ์ฒํ๋ฉฐ ๊ธ์ ๋ง๋ฌด๋ฆฌํ๋ค.
'๐ฌapplication > - Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ์ ํ์ด์ง์ด ๋๋ฆฐ ์ง์ง ์ด์ (3) | 2023.11.19 |
---|---|
[๋ฐ์ดํฐ๋ฒ ์ด์ค] Isolation Level, ๊ณ ๋ฆฝ ์์ค (0) | 2021.04.07 |
[๋ฐ์ดํฐ๋ฒ ์ด์ค] Transaction, ํธ๋์ญ์ ์ด๋? (0) | 2021.04.07 |
[SQL๋ฌธ ๊ธฐ์ด] DML ๋ฐ์ดํฐ ์กฐ์์ด :: INSERT, UPDATE, DELETE (0) | 2020.07.07 |
[SQL๋ฌธ ๊ธฐ์ด] DDL ๋ฐ์ดํฐ ์ ์์ด :: CREATE, ALTER, DROP, TRUNCATE ๋ฌธ (1) | 2020.07.07 |
๋๊ธ