๐ ์คํ ๋ฆฌ์ง ์์ง
MySQL์ ์คํ ๋ฆฌ์ง ์์ง์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ InnoDB์ ๋ํด์ ์์๋ณด์. ์์ผ๋ก ์คํ ๋ฆฌ์ง ์์ง์ด๋ผ๊ณ ํ๋ฉด InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด๋ค.
๋ค์์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ํคํ ์ฒ ๋์๋์ด๋ค. ์ธ๋ถ์ ์ผ๋ก ํํ๋์ด์ผ ํ ๋ถ๋ถ์ ๋ค์์ ์์ธํ ์ค๋ช ํ ๊ฒ์ด๋ค.
๐ InnoDB์ ํน์ง
โ๏ธ ํ๋ผ์ด๋จธ๋ฆฌ ํค์ ์ํ ํด๋ฌ์คํฐ๋ง
InnoDB์ ๋ชจ๋ ํ ์ด๋ธ์ PK๋ฅผ ๊ธฐ์ค์ผ๋ก ํด๋ฌ์คํฐ๋ง๋์ด ์ ์ฅ๋๋ค. ํด๋ฌ์คํฐ๋ง์ด๋ ํน์ ์ด์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ์ฌ ๋์คํฌ ์์์ ์๋ก ์ธ์ ํ๊ฒ ์ ์ฅํด์ฃผ๋ ๊ธฐ์ ์ด๋ค. ์ฆ, InnoDB์ ๋ชจ๋ ํ ์ด๋ธ์ PK๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋น์ทํ ๊ฐ๋ค์ด ๋ชจ์ฌ ์๋ค. ์ด๋ ๋ฒ์ ๊ฒ์์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
โ๏ธ MVCC(Multi Version Concurrency Control)
Multi Version์ด๋ ํ๋์ ๋ ์ฝ๋์ ๋ํด์ ์ฌ๋ฌ ๋ฒ์ ์ ๋ ์ฝ๋ ๊ฐ์ด ์กด์ฌํจ์ ์๋ฏธํ ์ ์์์ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ ์ด๋ธ์ด ์๊ณ ํ์์ grade๊ฐ ์๋ชป ๋์ด ์์ ํ๋ค๊ณ ํด๋ณด์.
๋ค์๊ณผ ๊ฐ์ UPDATE ์ฟผ๋ฆฌ๋ฌธ์ ๋ ๋ฆฌ ์ ์๋ค.
UPDATE student SET studnet.grade = 1 WHERE student.id = 2
InnoDB๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ ๋ ๋ฆฌ๋ฉด Mango์ ํ๋ ์ 1๋ก ๋์ฌ๊น ? 2๋ก ๋์ฌ๊น?
SELECT * FROM student WHERE student.id = 2;
์ด๋ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ๊ฒ์ด๋ค. ๊ฒฉ๋ฆฌ ์์ค์ด READ_UNCOMMITTED์ธ ๊ฒฝ์ฐ์๋ 2๋ก ๋์ฌ ๊ฒ์ด๋ค. ๋ง์ฝ READ_COMMITED๋ ๊ทธ ์ด์์ ๊ฒฉ๋ฆฌ ์์ค์ด๋ผ๋ฉด 1๋ก ๋์ฌ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ ๊น?
์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๊ตฌ์กฐ๋ฅผ ์ข ๋ ์์ธํ ์ดํด๋ณด์.
- ์ธ๋ ํ์ด์ง : InnoDB ํธ๋์ญ์ ์ ๋กค๋ฐฑ์ ์ง์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฉ์ปค๋์ฆ. ๋กค๋ฐฑ์ด ํ์ํ ๊ฒฝ์ฐ, ์ธ๋ ํ์ด์ง๋ฅผ ์ด์ฉํ์ฌ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ด์ ์ํ๋ก ๋ณต์ํ๊ณ , ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ๋์คํฌ์ ๋ฐ์ํ์ง ์๊ณ ์ญ์ ํ์ฌ ๋กค๋ฐฑํ๋ค.
- ์ฒด์ธ์ง ๋ฒํผ : InnoDB๋ ๋ฐ์ดํฐ๋ฅผ ํ์ด์ง ๋จ์๋ก ๋์คํฌ์ ๊ธฐ๋กํ๋๋ฐ, ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ก ๋์คํฌ์ ๊ธฐ๋ก๋๋ ๊ฒ์ด ์๋๋ผ, ๋จผ์ ์ฒด์ธ์ง ๋ฒํผ์ ๊ธฐ๋ก๋๋ค.
- ๋ฐ์ดํฐ ํ์ด์ง ๋ฒํผ : ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ฑํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ด์ UPDATE ์ฟผ๋ฆฌ๋ฌธ์ด ๋ ๋ผ๊ฐ์ ๋ InnoDB์ ์ธ๋ ๋ก๊ทธ์ ๋ค์๊ณผ ๊ฐ์ ๋ ์ฝ๋๊ฐ ์๊ธด๋ค.
์ด๋, SELECT๋ฌธ์ ๋ ๋ฆฌ๋ฉด READ_UNCOMMITED๋ ์ธ๋ ๋ก๊ทธ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ณ READ_COMMITED ์ด์์ ํธ๋์ญ์ ๋ฝ์ ๋ฒํผ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์จ๋ค.
UPDATE ์ดํ COMMIT ๋ช ๋ น์ ๋ด๋ฆฌ๋ฉด InnoDB๋ ๋ณ๊ฒฝ ์์ ์์ด ์ง๊ธ์ ์ํ๋ฅผ ์๊ตฌ์ ์ธ ๋ฐ์ดํฐ๋ก ๋ง๋ค์ด ๋ฒ๋ฆฐ๋ค. ๋กค๋ฐฑ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ์ธ๋ ์์ญ์ ์๋ ๋ฐฑ์ ๋ฐ์ดํฐ๋ฅผ InnoDB ๋ฒํผ ํ๋ก ๋ณต๊ตฌํ๊ณ , ์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค.
โ๏ธ์๋ ๋ฐ๋๋ฝ ๊ฐ์ง
InnoDB ์คํ ๋ฆฌ ์์ง์ ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ์ ๊ธ ๋๊ธฐ ๊ทธ๋ํ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒดํฌํ๊ณ , ๊ต์ฐฉ ์ํ์ ๋น ์ง ํธ๋์ญ์ ๋ค์ ์ฐพ์์ ๊ทธ ์ค ํ๋๋ฅผ ์ข ๋ฃ์ํจ๋ค. ๊ธฐ์ค์ ์ธ๋ ๋ก๊ทธ ๋ ์ฝ๋๋ฅผ ๋ ์ ๊ฒ ๊ฐ์ง ํธ๋์ญ์ ์ด ์ผ๋ฐ์ ์ผ๋ก ๋กค๋ฐฑ์ด ๋๋ค.
โ๏ธ ์๋ํ๋ ์ฅ์ ๋ณต๊ตฌ
InnoDB์๋ ์์ค์ด๋ ์ฅ์ ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ธฐ ์ํ ์ฌ๋ฌ ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ด ์๋ค. ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ์ด์ฉํด MySQL ์๋ฒ๊ฐ ์์๋ ๋ ์๋ฃ๋์ง ๋ชปํ ํธ๋์ญ์ ์ด๋ ๋์คํฌ์ ์ผ๋ถ๋ง ๊ธฐ๋ก๋ ๋ฐ์ดํฐ ํ์ด์ง ๋ฑ์ ๋ํ ์ผ๋ จ์ ๋ณต๊ตฌ ์์ ์ด ์๋์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
๐ InnoDB ๋ฒํผ ํ
๋์คํฌ์ ๋ฐ์ดํฐ ํ์ผ์ด๋ ์ธ๋ฑ์ค ์ ๋ณด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ํด ๋๋ ๊ณต๊ฐ์ด๋ค. ์ฐ๊ธฐ ์์ ์ ์ง์ฐ์์ผ ์ผ๊ด ์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฒํผ ์ญํ ์ ํ๊ธฐ๋ ํ๋ค. InnoDB ๋ฒํผ ํ์ ๋ด๋ถ์ ์ผ๋ก 128MB ์ฒญํฌ ๋จ์๋ก ์ชผ๊ฐ์ด ๊ด๋ฆฌ๋๋ฉฐ, ์ด๋ ๋ฒํผ ํ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ฑฐ๋ ๋๋ฆฌ๊ธฐ ์ํ ๋จ์ ํฌ๊ธฐ๋ก ์ฌ์ฉ๋๋ค.
โ๏ธ ๋ฒํผ ํ์ ๊ตฌ์กฐ
์คํ ๋ฆฌ์ง ์์ง์ ๋ฒํผ ํ์ด๋ผ๋ ๊ฑฐ๋ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์ด์ง ํฌ๊ธฐ์ ์กฐ๊ฐ์ผ๋ก ์ชผ๊ฐ์ด InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ ๋ ํด๋น ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ์ฝ์ด์ ๊ฐ ์กฐ๊ฐ์ ์ ์ฅํ๋ค.
๋ฒํผ ํ์ LRU ๋ฆฌ์คํธ๋ฅผ ๊ด๋ฆฌํจ์ผ๋ก์จ ํ ๋ฒ ์ฝ์ด์จ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํด์ ๋์คํฌ ์ฝ๊ธฐ๋ฅผ ์ต์ํํ๋ค. LRU๊ฐ ๋์ํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ํ ๋ฐ์ดํฐ๊ฐ ๋ฒํผ ํ์ ์๋์ง ๊ฒ์ฌํ๋ค.
- ์ด๋ InnoDB ์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ฌ ํ์ด์ง๋ฅผ ๊ฒ์ํ๋ค.
- ๋ฒํผ ํ์ด ์ด๋ฏธ ๋ฐ์ดํฐ ํ์ด์ง์ ์๋ค๋ฉด ํด๋น ํ์ด์ง์ ํฌ์ธํฐ๋ฅผ MRU ๋ฐฉํฅ์ผ๋ก ์น๊ธํ๋ค.
- ๋์คํฌ์์ ํ์ํ ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ๋ฒํผ ํ์ ์ ์ฌํ๊ณ , ์ ์ฌ๋ ํ์ด์ง์ ๋ํ ํฌ์ธํฐ๋ฅผ LRU ํค๋ ๋ถ๋ถ์ ์ถ๊ฐํ๋ค.
- ๋ฒํผ ํ์ LRU ํค๋ ๋ถ๋ถ์ ์ ์ฌ๋ ๋ฐ์ดํฐ ํ์ด์ง๊ฐ ์ค์ ๋ก ์ฝํ๋ฉด MRU ํค๋ ๋ถ๋ถ์ผ๋ก ์ด๋ํ๋ค.
- ๋ฒํผ ํ์ ์์ฃผํ๋ ๋ฐ์ดํฐ ํ์ด์ง๋ ์ฌ์ฉ์ ์ฟผ๋ฆฌ๊ฐ ์ผ๋ง๋ ์ต๊ทผ์ ์ ๊ทผํ์๋์ง์ ๋ฐ๋ผ ๋์ด๊ฐ ๋ถ์ฌ๋๊ณ , ์ค๋ซ๋์ ์ฌ์ฉ๋์ง ์์ผ๋ฉด ํด๋น ๋ฒํผ ํ์์ ์ ๊ฑฐ ๋๋ค.
โ๏ธ ๋ฒํผ ํ๊ณผ ๋ฆฌ๋ ๋ก๊ทธ
InnoDB ๋ฒํผ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๋ฐ์ดํฐ ์บ์์ ๋ฒํผ๋ง์ด๋ผ๋ ๋ ๊ฐ์ง ์ต์ ์ ์ ๊ณตํ๋ค. ๋ฒํผ ํ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๋ง ๋จ์ํ ๋๋ฆฌ๋ ๊ฒ์ ๋ฐ์ดํฐ ์บ์ ๊ธฐ๋ฅ๋ง ํฅ์์ํค๋ ๊ฒ์ด๋ค. ๋ฒํผ๋ง ๊ธฐ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด์๋ ๋ฒํผ ํ๊ณผ ๋ฆฌ๋ ๋ก๊ทธ์์ ๊ด๊ณ๋ฅผ ์ดํดํด์ผ ํ๋ค.
InnoDB์ ๋ฒํผ ํ์ ๋์คํฌ์์ ์ฝ์ ์ํ๋ก ๋ณ๊ฒฝ๋์ง ์์ ํด๋ฆฐ ํ์ด์ง์ ๋ณ๊ฒฝ๋ ๋ํฐ ํ์ด์ง๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ํฐ ํ์ด์ง๋ ๋์คํฌ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ์ํ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋์คํฌ์ ๊ธฐ๋ก๋์ด์ผ ํ๋ค. ๋ฒํผ ํ์ ๋ํฐ ํ์ด์ง๋ ํน์ ๋ฆฌ๋ ๋ก๊ทธ ์ํธ๋ฆฌ์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ , ์ฃผ๊ธฐ์ ์ผ๋ก ๋์คํฌ์ ๋๊ธฐํ๋๋ค.
๋ฒํผ ํ์ด 50GB์ด๋ฉฐ ๋ฆฌ๋ ๋ก๊ทธ ํ์ผ์ ์ ์ฒด ํฌ๊ธฐ๊ฐ 50MB์ธ ๊ฒฝ์ฐ์๋ ๋ฒํผ๋ง ํจ๊ณผ๋ฅผ ์ ํ ๋ชป๊ฒ ๋๊ณ , ๋ฒํผ ํ์ด 50Mb์ด๊ณ ๋ฆฌ๋ ๋ก๊ทธ ํ์ผ์ ์ ์ฒด ํฌ๊ธฐ๊ฐ 50GB๋ผ๋ฉด ์ต๋ ํ์ฉ ๊ฐ๋ฅํ ๋ํฐ ํ์ด์ง๋ ๋๋ต 50MB๊ฐ ๋๋ค. ํ์์ ๊ฒฝ์ฐ์๋ ๊ธ์์ค๋ฌ์ด ๋์คํฌ ์ฐ๊ธฐ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. (๋ฉ๋ชจ๋ฆฌ์ 90%๊ฐ ์ฌ์ฉ๋์ด InnoDB๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋๋์ผ๋ก ์ฒ๋ฆฌํ๋ ํ์). ๋ฐ๋ผ์ ์ ์ ํ ๋ฆฌ๋ ๋ก๊ทธ ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๐ ์ธ๋ ๋ก๊ทธ
ํธ๋์ญ์ ๊ณผ ๊ฒฉ๋ฆฌ ์์ค์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฟผ๋ฆฌ๊ฐ ์ค๋ฉด ๋ณ๊ฒฝ๋๊ธฐ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์ ํ๋ค. ์ด๋ ๊ฒ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ ๋ก๊ทธ๋ผ๊ณ ํ๋ค.
์ด๋ฐ ์ธ๋ ๋ก๊ทธ๋ ๋์ฉ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ๋๋ ์ค๋ ์๊ฐ ๋์ ์คํ๋ ๋ ์์ด ๊ธ๊ฒฉํ ์ฆ๊ฐํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ํธ๋์ญ์ B์ C๋ ์์ ์ด ๋๋ฌ์์๋ ๋ถ๊ตฌํ๊ณ ํธ๋์ญ์ A๊ฐ ๋๋ ๋๊น์ง ์ธ๋ ๋ก๊ทธ๋ ์ ๋ฆฌํ ์ ์๋ค.
T(A) : BEGIN --> SELECT ---------------------------------------------->
T(B) : BEGIN -> UPDATE -> COMMIT
T(C) : BEGIN -> DELETE -> COMMIT
์ด๋ฐ ๋ฌธ์ ์ ์ MySQL 8.0๋ถํฐ๋ ์ธ๋ ๋ก๊ทธ์ ๋์คํฌ ๊ณต๊ฐ์ ์กฐ์ ๊ธฐ๋ฅ์ด ๋์ ๋๋ฉด์ ์ฌ๋ผ์ก๋ค.
๐ ์ฒด์ธ์ง ๋ฒํผ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ก์ด ๋ ์ฝ๋๊ฐ Insert๋๊ฑฐ๋ Update๋ ๋๋ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ ์์ ๋ ํ์ํ๋ค. ์ธ๋ฑ์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ ์์ ์ ๋๋คํ๊ฒ ๋์คํฌ๋ฅผ ์ฝ๋ ์์ ์ด ํ์ํ๋ฏ๋ก ์์ ์ ์ฅ ๊ณต๊ฐ์ธ ์ฒด์ธ์ง ๋ฒํผ์ ์ ์ฅํด ๋๊ณ ๋์ค์ ํ ๋ฒ์ ์ ๋ฐ์ดํธ ํ๋ค.