์ฑ๋ฅ ํ ์คํธ๋ฅผ ์งํํ๋ฉด์ MySQL์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์์ธํ ๋ชจ๋ฅด๊ณ ์๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ํนํ InnoDB ๋ฒํผ ํ์ด๋ผ๋ ๊ณต๊ฐ์ ๋ฒํผ์ ์บ์์ ์ญํ ์ ํ๋ ๊ฒ์ผ๋ก ์๊ณ ์๋๋ฐ, ๊ทธ๋ ๋ค๋ฉด ์ด ๋ถ๋ถ์ด ์ฑ๋ฅ ์ธก์ ์ ์ํฅ์ ์ค ๋ฟ๋๋ฌ, ์ฟผ๋ฆฌ ํน์ฑ์ ๋ฐ๋ผ ์ ์ ํ ์กฐ์ ํ๋ค๋ฉด ์ฑ๋ฅ ํฅ์์ ๋์์ด ๋ ์๋ ์๊ฒ ๋ค๋ผ๋ ์๊ฐ์์ ๊ณต๋ถ๋ฅผ ์์ํ๊ณ ๊ทธ ๊ณผ์ ์์ ์๊ฒ๋ ๊ฒ๋ค์ ์์ผ๋ก 2~3๊ฐ์ ๊ธ์์ ๋ค๋ค๋ณด๊ณ ์ ํ๋ค.
โ๏ธ MySQL ์ํคํ ์ฒ
MySQL ์ํคํ ์ฒ๋ ํฌ๊ฒ MySQL์์ง๊ณผ ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ด ๊ธ์์ ์คํ ๋ฆฌ์ง ์์ง์ ํ์ฌ MySQL์ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ์์ง์ธ InnoDB๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค๋ฃฌ๋ค. MySQL ์์ง์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ ์์ฒญ, ์ฆ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ํ๊ณ ์ต์ ํํ๋ ์ญํ ์ ํ๋ฉฐ, ์คํ ๋ฆฌ์ง ์์ง์ ์ง์ ๋์คํฌ์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ์์ ์ ํ๋ค.
MySQL ์ํคํ ์ฒ๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ์ผ๋ก ๋์ด์๋ค.
- ์ฟผ๋ฆฌ ํ์: ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ ์ฟผ๋ฆฌ์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ์ฒดํฌํ๊ณ ํ ํฐ ๋จ์๋ก ๋ถ๋ฆฌํด ํ์ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
- ์ ์ฒ๋ฆฌ๊ธฐ: ํ์ ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ ์ ์ด ์๋์ง ํ์ธํ๋ค. ์ด ๋จ๊ณ์์ ํ ์ด๋ธ ์ด๋ฆ์ด๋ ์นผ๋ผ ์ด๋ฆ๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๋งคํํด ํด๋น ๊ฐ์ฒด์ ์กด์ฌ ์ฌ๋ถ์ ์ ๊ทผ ๊ถํ์ ํ์ธํ๋ค.
- ์ตํฐ๋ง์ด์ : ์ฟผ๋ฆฌ์ ์ต์ ํ๋ ์คํ๊ณํ์ ์ธ์ด๋ค.
- ์คํ ์์ง: ์คํ ๊ณํ๋๋ก ํธ๋ค๋ฌ์๊ฒ ์์ฒญํ๋ฉฐ, ์์ฒญ์ ๋ํ ์๋ต์ ๋ ๋ค๋ฅธ ํธ๋ค๋ฌ์ ์ ๋ ฅ์ผ๋ก ์ ๋ฌํด์ฃผ๋ ์ญํ ์ ํ๋ค.
- ํธ๋ค๋ฌ(์คํ ๋ฆฌ์ง ์์ง): MySQL ์์ง์ ์์ฒญ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์ ์ฅํ๊ฑฐ๋ ๋ถ๋ฌ์ค๋ ์ญํ ์ ํ๋ค.
โ๏ธ MySQL ์ค๋ ๋ ๊ตฌ์กฐ
MySQL ์ปค๋ฎค๋ํฐ ๋ฒ์ ์ ์ฐ๋ ๋ ์บ์๋ก ๋์ํ๊ณ , ์ํฐํ๋ผ์ด์ฆ ๋ฒ์ ์ ์ฐ๋ ๋ ํ์ ์ง์ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ ๋ ์บ์์ ์ฐ๋ ๋ ํ์ ๋ฌด์จ ์ฐจ์ด๊ฐ ์์๊น?
๐ ์ฐ๋ ๋ ์บ์
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ฐ๋ ๋๋ ์ฐ๋ ๋ ์บ์์ ๋ฐ๋ฉ๋๋ค.
- ์ฐ๋ ๋ ์บ์์ ์ฐ๋ ๋ ์บ์ ์ฌ์ด์ฆ๋งํผ์ ์ฐ๋ ๋๊ฐ ๋ณด๊ด ์ค์ผ ๋ ์ฐ๋ ๋๊ฐ ๋ฐ๋ฉ๋๋ฉด, ํด๋น ์ฐ๋ ๋๋ ์ญ์ ๋๋ค.
- ์ฐ๋ ๋ ์บ์ ์ฌ์ด์ฆ๊ฐ 10์ผ ๋, ์ฐ๋ ๋ ์บ์์ 10๊ฐ์ ์ฐ๋ ๋๊ฐ ๋ณด๊ด์ค์ด๋ฉด์ ๋ค๋ฅธ 10๊ฐ์ ์ฐ๋ ๋๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์์ ์ ์๋ค.
๐ ์ฐ๋ ๋ ํ
- ์ฐ๋ ๋ ํ ์ฌ์ด์ฆ๋ MySQL ์๋ฒ์์ ์ฌ์ฉํ ์ ์๋ ์ฐ๋ ๋ ๊ฐ์๋ฅผ ์๋ฏธํ๋ค. (๋ณ๋ ฌ ์ฒ๋ฆฌํ ์ ์๋ ์ฟผ๋ฆฌ์ ๊ฐ์)
- ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์ผํ๊ณ ์์ ๋, ์๋ก์ด ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํด๋น ์์ฒญ์ ์ด๋ฏธ ์ฒ๋ฆฌ์ค์ธ ์์ฒญ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํ๋ค.
์ฐ๋ ๋ ํ์ ์ฌ์ฉํ ๋, ๋๋ฌด ๋ง์ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ง ์๋ค. ํ์ ๋ CPU๋ฅผ ์ค์ผ์ฅด๋ง ํด์ผํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ ๋๊ฐ ๋ง์์ง๋ฉด, ์ปจํ ์คํธ ์ค์์นญ์ด ๋ง์ด ๋ฐ์ํ์ฌ ์คํ๋ ค ๋น์ฉ์ด ๋ ์ปค์ง ์ ์๋ค.
MySQL ์ค๋ ๋๋ ํฌ๊ทธ๋ผ์ด๋ ์ค๋ ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ๊ตฌ๋ถํ ์ ์๋ค.
๐ ํฌ๊ทธ๋ผ์ด๋ ์ค๋ ๋
ํฌ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ ์ต์ํ MySQL ์๋ฒ์ ์ ์๋ ํด๋ผ์ด์ธํธ์ ์๋งํผ ์กด์ฌํ๋ค.
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํฌ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ ๋ฒํผ์ ์บ์์์ ์ฝ์ด์ค๋ฉฐ, ์ด ๊ณณ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ ์ ์ง์ ๋์คํฌ์ ๋ฐ์ดํฐ๋ ์ธ๋ฑ์ค ํ์ผ์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์จ๋ค. ์ด ์ธ์ ๋ฒํผ๋ก๋ถํฐ ๋์คํฌ๊น์ง ๊ธฐ๋กํ๋ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์ฒ๋ฆฌํ๋ค.
๐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋
- ๋ก๊ทธ๋ฅผ ๋์คํฌ๋ก ๊ธฐ๋กํ๋ ์ค๋ ๋
- InnoDB ๋ฒํผ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ๊ธฐ๋กํ๋ ์ค๋ ๋
- ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ๋ก ์ฝ์ด์ค๋ ์ค๋ ๋ (ํด๋ผ์ด์ธํธ ์ฟผ๋ฆฌ์ ์ํ ์ฝ๊ธฐ๊ฐ ์๋, Read Ahead์ ๊ฐ์ ์ฑ๋ฅ ํฅ์์ ์ํ ์ฝ๊ธฐ)
- ์ธ์ํธ ๋ฒํผ๋ฅผ ๋ณํฉํ๋ ์ค๋ ๋
- ์ ๊ธ์ด๋ ๋ฐ๋๋ฝ์ ๋ชจ๋ํฐ๋งํ๋ ์ค๋ ๋
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ๋ก๊ทธ ์ค๋ ๋์ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ๋ก ๋ด๋ ค์ฐ๋ ์์ ์ ํ๋ ์ฐ๊ธฐ ์ค๋ ๋์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์์ ์ ์ฃผ๋ก ํฌ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์ฝ๊ธฐ ์ค๋ ๋๋ ๋ง์ด ์ค์ ํ ํ์๊ฐ ์์ง๋ง ์ฐ๊ธฐ ์ค๋ ๋๋ ์์ฃผ ๋ง์ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ๋ด์ฅ ๋์คํฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก 2~4๋ก ์ค์ ํ๋ค.
โ๏ธ MySQL ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
MySQL์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ๊ธ๋ก๋ฒ ๋ฉ๋ชจ๋ฆฌ ์์ญ๊ณผ ๋ก์ปฌ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก ๋๋ ์ง๋ค.
๐ ๊ธ๋ก๋ฒ ๋ฉ๋ชจ๋ฆฌ
MySQL ์๋ฒ๋ฅผ ์คํํ ๋ ์ด์์ฒด์ ๋ก๋ถํฐ ์ค์ ํ ๋งํผ ํ ๋น๋ฐ ์์ญ์ด๋ฉฐ ๋ชจ๋ ์ค๋ ๋๋ก๋ถํฐ ๊ณต์ ๋๋ค.
๐ ๋ก์ปฌ(์ธ์ ) ๋ฉ๋ชจ๋ฆฌ
ํด๋ผ์ด์ธํธ ์ค๋ ๋๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์ฐ์ด๋ ์์ญ์ด๋ฉฐ ์ค๋ ๋ ๋ณ๋ก ๋ ๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ณต์ ๋์ง ์๋๋ค.
๋ฒํผ ์ค ์ปค๋ฅ์ ๋ฒํผ์ ๊ฒฐ๊ณผ ๋ฒํผ๋ ์ปค๋ฅ์ ์ด ์ด๋ ค์๋ ๋์ ๊ณ์ ํ ๋น๋ ์ํ๋ก ๋จ์์์ง๋ง ์กฐ์ธ ๋ฒํผ์ ์ํธ ๋ฒํผ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ์๊ฐ์๋ง ํ ๋นํ๋ค๊ฐ ํด์ ๋๋ค.
โ๏ธ InnoDB ์คํ ๋ฆฌ์ง ์์ง ์ํคํ ์ฒ
InnoDB๋ MySQL์์ ์ฌ์ฉํ ์ ์๋ ์คํ ๋ฆฌ์ง ์์ง ์ค์์ ๊ฑฐ์ ์ ์ผํ๊ฒ ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ๋ฝ์ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ, ๋๋ฌธ์ ๋์ ๋์์ฑ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ณ ์์ ์ ์ด๋ฉฐ ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ค.
๊ตฌ์กฐ๋ ํฌ๊ฒ ๋ฉ๋ชจ๋ฆฌ ์์ญ๊ณผ ๋์คํฌ(์คํ ๋ฆฌ์ง) ์์ญ์ผ๋ก ๋๋ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์์ญ
- InnoDB ๋ฒํผ ํ : ์ค์ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๋ ์์ญ + ์ธ์ํธ ๋ฒํผ + ์ธ๋ ๋ ์ฝ๋
- ๋ก๊ทธ ๋ฒํผ : ๋ก๊ทธ ์ค๋ ๋์ ์ํด ๋ก๊ทธ ํ์ผ๋ก ๊ธฐ๋ก๋๊ธฐ ์ ๋ฒํผ๋ง ํ๋ ์์ญ
- ๋์คํฌ ์์ญ
- ์์คํ ํ ์ด๋ธ ์คํ์ด์ค
- ์ฌ์ฉ์ ํ ์ด๋ธ ์คํ์ด์ค
- ๋ฆฌ๋ ๋ก๊ทธ
โ๏ธ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํน์ฑ
1๏ธโฃ ํ๋ผ์ด๋จธ๋ฆฌ ํค์ ์ํ ํด๋ฌ์คํฐ๋ง
InnoDB์ ๋ชจ๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ผ์ด๋จธ๋ฆฌ ํค๋ฅผ ๊ธฐ์ค์ผ๋ก ํด๋ฌ์คํฐ๋ง๋์ด ์ ์ฅ๋๋ค. ์ฆ, ํ๋ผ์ด๋จธ๋ฆฌ ํค ๊ฐ์ ์์๋๋ก ๋์คํฌ์ ์ ์ฅ๋๋ค๋ ๋ป์ด๋ฉฐ, ์ด๋ก ์ธํด ํ๋ผ์ด๋จธ๋ฆฌ ํค์ ์ํ Range Scan์ ์๋นํ ๋นจ๋ฆฌ ์ฒ๋ฆฌ ๋ ์ ์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์์ ํ๋ผ์ด๋จธ๋ฆฌ ํค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ๋ณด์กฐ ์ธ๋ฑ์ค์ ๋นํด ๋น์ค์ด ๋๊ฒ ์ค์ ๋๋ค.
2๏ธโฃ FK(์ธ๋ ํค) ์ง์
InnoDB์์ FK๋ ๋ถ๋ชจ ํ ์ด๋ธ / ์์ ํ ์ด๋ธ ๋ชจ๋ ํด๋น Column์ ์ธ๋ฑ์ค ์์ฑ์ด ํ์ํ๋ค.
๋ถ๋ชจ ํ ์ด๋ธ์ PK ๋ณ๊ฒฝ ์ ๋ถ๋ชจ ํ ์ด๋ธ / ์์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ์ฒดํฌํ๋ ์์ ์ด ํ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ํ ์ด๋ธ๋ก Lock์ด ์ ํ๋ ์ ์๊ณ , ์ด์ ๋ฐ๋ผ DB์์ ๋ฐ๋๋ฝ์ด ๋ง์ด ๋ฐ์ํ ์ ์๋ค.
์ด๋ฅผ ์ํด foreign_key_checks ์ต์ ์ด ์ค์ ๊ฐ๋ฅํ๋ค.
3๏ธโฃ ์ ๊ธ์ด ํ์์๋ ์ผ๊ด๋ ์ฝ๊ธฐ(Non-locking consistent read)
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ MVCC๋ฅผ ์ด์ฉํด ๋ฝ์ ๊ฑธ์ง ์๊ณ ์ฝ๊ธฐ ์์ ์ ์ํํ๋ค. ๋ฝ์ ๊ฑธ์ง ์๊ธฐ ๋๋ฌธ์ InnoDB์์ ์ฝ๊ธฐ ์์ ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ฐ์ง๊ณ ์๋ ๋ฝ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฝ๊ธฐ ์์ ์ด ๊ฐ๋ฅํ๋ค(SERIALIZABLE ๊ฒฉ๋ฆฌ ์์ค ์ ์ธ)
4๏ธโฃ ์๋ ๋ฐ๋๋ฝ ๊ฐ์ง
InnoDB๋ ๋ฝ ๋๊ธฐ ๋ชฉ๋ก์ ๊ทธ๋ํ ํํ๋ก ๊ฐ์ง๊ณ ์๋ค. ๋ง์ฝ ๋ฐ๋๋ฝ์ด ๋ฐ์ํ๋ค๋ฉด ์๋์ ์ผ๋ก ๊ฐ์ง๋๊ณ ๊ฐ์ง๋ ๋ฐ๋๋ฝ์ ๊ด๋ จ ํธ๋์ญ์ ์ค์์ ROLLBACK์ด ๊ฐ์ฅ ์ฉ์ดํ ํธ๋์ญ์ (๊ฐ์ฅ ์ ์ UNDO ๋ก๊ทธ๋ฅผ ๊ฐ์ง ํธ๋์ญ์ )์ ์๋์ ์ผ๋ก ๊ฐ์ ์ข ๋ฃํ๋ค.
๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋๋ ์ ๊ธ ๋ชฉ๋ก์ ๊ฒ์ฌํ ๋ ์ํ๊ฐ ๋ณํ์ง ์๋๋ก ์ ๊ธ ๋๊ธฐ ๋ชฉ๋ก์ ๋ฝ์ ๊ฑธ์ด๋๊ณ ๊ฒ์ฌํ๋ค.
โ๏ธ InnoDB ๋ฒํผ ํ๊ณผ ๋ฆฌ๋ ๋ก๊ทธ
InnoDB ์คํ ๋ฆฌ์ง ์์ง์์ ๊ฐ์ฅ ํต์ฌ์ ์ธ ๋ถ๋ถ์ผ๋ก, ๋์คํฌ์ ๋ฐ์ดํฐ ํ์ผ์ด๋ ์ธ๋ฑ์ค ์ ๋ณด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ํด ๋๋ ๊ณต๊ฐ์ด๋ค. ์ฐ๊ธฐ ์์ ์ ์ง์ฐ์์ผ ์ผ๊ด ์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฒํผ ์ญํ ๋ ๊ฐ์ดํ๋ค. ๋ฒํผ ํ์ ๋ํด์๋ ๋ค์ ๊ธ์์ ์์ธํ ๋ค๋ฃฐ ์์ ์ด๋ค.