๐พ[Database] ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ - ํ์ด์ง ์ฒ๋ฆฌ.
โ 1๏ธโฃ ๋นํจ์จ์ ์ธ ํ์ด์ง ์ฒ๋ฆฌ.
- โ๏ธ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์
๋ด์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋์คํฌ์ ์ ์ฅ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ํน์ ํ์ด์ง๋ง ์ถ์ถํ๋ ๊ฒ์ ๋นํจ์จ์ ์.
- โ๏ธ ๋์คํฌ ์ ๊ทผ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๋ณด๋ค ๋๋ฆฌ๊ธฐ ๋๋ฌธ์.
- โ๏ธ ๋์คํฌ I/O ๋น์ฉ
- โ๏ธ ๋์คํฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ์ด๊ณผํ ์ ์์.
- โ๏ธ Out of Memory(OOM)
- โ๏ธ ์์คํ
์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ชจ๋ ์ฌ์ฉ๋์ด ๋ ์ด์ ํ ๋นํ ์ ์๋ ์ํฉ.
โ 2๏ธโฃ ํจ์จ์ ์ธ ํ์ด์ง ์ฒ๋ฆฌ.
- โ๏ธ ์์คํ
์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ชจ๋ ์ฌ์ฉ๋์ด ๋ ์ด์ ํ ๋นํ ์ ์๋ ์ํฉ.
- โ๏ธ Out of Memory(OOM)
- โ๏ธ ๋์คํฌ ์ ๊ทผ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๋ณด๋ค ๋๋ฆฌ๊ธฐ ๋๋ฌธ์.
- โ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํน์ ํ์ด์ง์ ๋ฐ์ดํฐ๋ง ๋ฐ๋ก ์ถ์ถํ๋ ๋ฐฉ๋ฒ์ด ํ์ํจ.
- โ๏ธ ํ์ด์ง ์ฟผ๋ฆฌ
โ 3๏ธโฃ ํ์ด์ง ๋ฐฉ์.
- โ๏ธ ํ์ด์ง ์ฟผ๋ฆฌ
- โ๏ธ ํด๋ผ์ด์ธํธ ๋๋ ์๋น์ค ํน์ฑ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋จ
- โ๏ธ ํ์ด์ง ๋ฒํธ
- โ๏ธ ** ๋ฌดํ ์คํฌ๋กค**
๐ ํ์ด์ง ๋ฒํธ ๋ฐฉ์.
- โ๏ธ ์ด๋ํ ํ์ด์ง ๋ฒํธ๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ๋จ.
- โ๏ธ ์ํ๋ ํ์ด์ง๋ก ์ฆ์ ์ด๋ ๊ฐ๋ฅ.
๐ ๋ฌดํ ์คํฌ๋กค ๋ฐฉ์.
- โ๏ธ ์คํฌ๋กค์ ๋ด๋ฆฌ๋ฉด ๋ค์ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋จ. โ ๋๋ณด๊ธฐ.
- โ๏ธ ์ฃผ๋ก ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ ์ฌ์ฉํจ.
โ 4๏ธโฃ ํ์ด์ง ๋ฒํธ ๋ฐฉ์.
- โ๏ธ ํ์ํ ์ ๋ณด
- โ๏ธ 1๏ธโฃ N๋ฒ ํ์ด์ง์์ M๊ฐ์ ๊ฒ์๊ธ
- โ๏ธ 2๏ธโฃ ๊ฒ์๊ธ์ ๊ฐ์
- โ๏ธ ํ์ด์ง ๋ฒํธ ํ์ฑํ์ ํ์.
- โ๏ธ ์์: ํ์ด์ง ๋น 30๊ฐ์ ๊ฒ์๊ธ์ ๋ณด์ฌ์ฃผ๊ณ , ์ด 94๊ฐ์ ๊ฒ์๊ธ์ด ์๋ค๋ฉด, ์ฌ์ฉ์๋ ํด๋ผ์ด์ธํธ ํ๋ฉด์์ 4๋ฒ ํ์ด์ง๊น์ง ์ด๋ํ ์ ์๋ค๋ ์ฌ์ค์ ์ธ์งํด์ผ ํจ.
- โ๏ธ 3๏ธโฃ N๋ฒ ํ์ด์ง์์ M๊ฐ์ ๊ฒ์๊ธ์ ์กฐํํ๋ ค๋ฉด?
- โ๏ธ SQL offset, limit์ ํ์ฉํ์ฌ ํ์ด์ง ์ฟผ๋ฆฌ๋ฅผ ํ ์ ์์.
- โ๏ธ offset ์ง์ ๋ถํฐ, limit๊ฐ์ ๋ฐ์ดํฐ ์กฐํ.
- โ๏ธ 4๏ธโฃ SELECT ์ฟผ๋ฆฌ๋ก ๋ง๋ค์ด๋ณด๋ฉด?
- โ๏ธ ๊ฒ์ํ๋ณ ๊ฒ์๊ธ ๋ชฉ๋ก ์ต์ ์ ์กฐํ
- โ๏ธ
shard key = board_id
์ด๊ธฐ ๋๋ฌธ์, ๋จ์ผ ์ค๋์์ ์กฐํํ ์ ์์. - โ๏ธ
limit = M
๊ฐ์ ๊ฒ์๊ธ - โ๏ธ
offset = (N๋ฒ ํ์ด์ง - 1) * M
- โ๏ธ
N > 0
- โ๏ธ
- โ๏ธ
- โ๏ธ SQL QUERY
SELECT * FROM article // ๊ฒ์๊ธ ํ ์ด๋ธ WHERE board_id = {board_id} // ๊ฒ์ํ๋ณ ORDER BY created_at DESC // ์ต์ ์ LIMIT {LIMIT} OFFSET {OFFSET}; // N๋ฒ ํ์ด์ง์์ M๊ฐ
- โ๏ธ 1,200๋ง ๊ฑด์ ์ ์ ๋ฐ์ดํฐ์์ 30๊ฐ์ ๊ฒ์๊ธ์ ์กฐํํ๋๋ฐ 4์ด๊ฐ ์์๋์์. ์ ์์ ์ผ๋ก ์๋น์คํ๊ธฐ์๋ ์ด๋ ค์ด ์ํฉ์.
- โ๏ธ
explain select * from article where board_id = 1 order by created_at desc limit 30 offset 90;
- โ๏ธ
type = ALL
โ ํ ์ด๋ธ ์ ์ฒด๋ฅผ ์ฝ๋๋ค (ํ ์ค์บ) - โ๏ธ
Extras = Using where; Using filesort
โ where ์ ๋ก ์กฐ๊ฑด์ ๋ํด ํํฐ๋ง,- โ๏ธ ๋ฐ์ดํฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๋ ฌ์ ์ํํ ์ ์์ด์, ํ์ผ(๋์คํฌ)์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋
filesort
์ํ - โ๏ธ ์ ์ฒด ๋ฐ์ดํฐ์ ๋ํด ํํฐ๋ง ๋ฐ ์ ๋ ฌํ๊ธฐ ๋๋ฌธ์ ์์ฃผ ํฐ ๋น์ฉ์ด ๋ ๊ฒ.
- โ๏ธ ๋ฐ์ดํฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๋ ฌ์ ์ํํ ์ ์์ด์, ํ์ผ(๋์คํฌ)์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋
- โ๏ธ ๊ฒ์ํ๋ณ ๊ฒ์๊ธ ๋ชฉ๋ก ์ต์ ์ ์กฐํ
๐โโ๏ธ Query Plain
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฟผ๋ฆฌ์ ์ํด ๋ฐ์ดํฐ ์ ๊ทผ์ด ์คํ๋๋ ๊ณํ ๋๋ ์ ์ฐจ ์ฌ์ฉ๋ฒ.
explain {query}
โ 5๏ธโฃ ์ธ๋ฑ์ค์ ๋ํ ์ดํด
๐ Intro
- โ๏ธ ์ธ๋ฑ์ค(Index)๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ.
- โ๏ธ ์ฑ ์ ์์ธ(Index)๊ณผ ๋น์ทํ ๊ฐ๋ ์ผ๋ก, ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ํ์ํ์ง ์๊ณ ๋ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์กฐํํ ์ ์๋๋ก ๋์์ค.
โ 6๏ธโฃ ์ธ๋ฑ์ค์ ํต์ฌ ๊ฐ๋ .
- โ๏ธ ๋น ๋ฅธ ๊ฒ์ : ํ ์ด๋ธ์์ ํน์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์.
- โ๏ธ ์ ๋ ฌ๋ ๊ตฌ์กฐ : ์ธ๋ฑ์ค๋ ์ผ๋ฐ์ ์ผ๋ก B-Tree ๋๋ Hash ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํจ.
- โ๏ธ ์กฐํ ์ฑ๋ฅ ํฅ์ : WHERE, JOIN, BY์ ๊ฐ์ SQL ์ฐ์ฐ ์ ์ฑ๋ฅ์ ๊ฐ์ ํจ.
- โ๏ธ ๊ณต๊ฐ ์ฐจ์ง : ์ธ๋ฑ์ค๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ์ ์ฅ ๊ณต๊ฐ์ด ํ์ํจ.
- โ๏ธ ์ฐ๊ธฐ ์ฑ๋ฅ ์ ํ : INSERT, UPDATE, DELETE ์์ ์ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ฏ๋ก ์ฐ๊ธฐ ์์ ์ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์.
โ 7๏ธโฃ ์ธ๋ฑ์ค์ ์๋ ์๋ฆฌ.
- โ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ ์ด๋ธ์ ํน์ ์ปฌ๋ผ(์ด)์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํจ.
- โ๏ธ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋, ์ธ๋ฑ์ค๊ฐ ์๋ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ์ธ๋ฑ์ค๋ฅผ ๋จผ์ ์กฐํํจ.
- โ๏ธ ์ธ๋ฑ์ค๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์์น๋ฅผ ์ฐพ๊ณ , ํด๋น ์์น์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด.
โ 8๏ธโฃ ์ธ๋ฑ์ค์ ์ข ๋ฅ.
1๏ธโฃ ์ผ๋ฐ ์ธ๋ฑ์ค(B-Tree Index)
- โ๏ธ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ธ๋ฑ์ค.
- โ๏ธ ์ปฌ๋ผ์ ๊ฐ์ ์ค๋ฆ์ฐจ์ ๋๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ ์ฅํจ.
2๏ธโฃ ๊ณ ์ ์ธ๋ฑ์ค(Unique Index)
- โ๏ธ ์ธ๋ฑ์ค๊ฐ ์ง์ ๋ ์ปฌ๋ผ์ ์ค๋ณต๋ ๊ฐ์ ๊ฐ์ง ์ ์์.
- โ๏ธ PRIMARY KEY๋ UNIQUE ์ ์ฝ ์กฐ๊ฑด์ด ํฌํจ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ์์ฑ๋จ.
3๏ธโฃ ๋ณตํฉ ์ธ๋ฑ์ค(Composite Index)
- โ๏ธ ๋ ๊ฐ ์ด์์ ์ปฌ๋ผ์ ๊ฒฐํฉํ์ฌ ํ๋์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ฆ.
- โ๏ธ ๋ณตํฉ ์ธ๋ฑ์ค๋ ์ฌ๋ฌ ์กฐ๊ฑด์ ๋์์ ์ฌ์ฉํ ๋ ์ ์ฉ.
4๏ธโฃ ํํ ์คํธ ์ธ๋ฑ์ค(Full-Text Index)
- โ๏ธ ๋ฌธ์์ด ๊ฒ์์ ์ต์ ํ๋ ์ธ๋ฑ์ค.
- โ๏ธ ๋๋์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๋ ์ฌ์ฉ.
5๏ธโฃ ํด์ ์ธ๋ฑ์ค(Hash Index)
- โ๏ธ ๊ฐ์ ํด์ ํจ์๋ก ๋ณํํ์ฌ ์ ์ฅ.
- โ๏ธ ์ ํํ ๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์ ๋ ์ฌ์ฉ.
โ 9๏ธโฃ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ.
- โ๏ธ WHERE ์ ๋ก ํน์ ๋ฐ์ดํฐ๋ฅผ ์์ฃผ ์กฐํํ ๋.
- โ๏ธ JOIN ์ฐ์ฐ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ ๋.
- โ๏ธ ORDER BY ๋๋ GROUP BY ์ ๋ก ์ ๋ ฌ์ด๋ ๊ทธ๋ฃนํ๊ฐ ํ์ํ ๋
- โ๏ธ ์์ฃผ ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ ๋ํด ๋น ๋ฅธ ๊ฒ์์ด ํ์ํ ๋.
โ 1๏ธโฃ0๏ธโฃ ์ธ๋ฑ์ค ์ฌ์ฉ ์ ์ฃผ์์ .
- โ๏ธ ๊ณผ๋ํ ์ธ๋ฑ์ค ์์ฑ : ๋๋ฌด ๋ง์ ์ธ๋ฑ์ค๋ ์ฐ๊ธฐ ์ฑ๋ฅ์ ์ ํ์ํค๊ณ , ์ถ๊ฐ์ ์ธ ์ ์ฅ ๊ณต๊ฐ์ ์ฐจ์งํจ.
- โ๏ธ ๋ถํ์ํ ์ธ๋ฑ์ค : ์์ฃผ ์ฌ์ฉ๋์ง ์๋ ์ธ๋ฑ์ค๋ ์คํ๋ ค ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํ ์ ์์.
- โ๏ธ ์ธ๋ฑ์ค ํํธ ๋น์จ(Index Hit Rate) : ์ฟผ๋ฆฌ๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ ๋๋ก ํ์ฉํ๋์ง ๋ชจ๋ํฐ๋งํด์ผ ํจ.