Lock(์ ๊ธ) ๋?
- ๋์์ฑ์ ์ ์ดํ๊ธฐ ์ํจ
- ์ฌ๋ฌ ์ปค๋ฅ์ ์์ ๋์์ ๊ฐ์ ๋ ์ฝ๋๋ ํ ์ด๋ธ์ ์ ๊ทผํด ๋ณ๊ฒฝํ๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก ์์ธกํ ์ ์๋ ๊ฐ์ด ๋จ.
ํน์ง
- ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ธ ์ ๊ณต
- ๋์ ๋์์ฑ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์์ ์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋จ
4.2.1 Primary Key์ ์ํ ํด๋ฌ์คํฐ๋ง
Clustering Index ๋? [ p270 ์ฐธ์กฐ ]
Primary Key ๊ฐ์ด ๋น์ทํ ๋ ํฌ๋๋ผ๋ฆฌ ๋ฌถ์ด์ ์ ์ฅํ๋ ๊ฒ
InnoDB์ ํ ์ด๋ธ ํน์ง
- Primary Key๋ฅผ ๊ธฐ์ค์ผ๋ก ํด๋ฌ์คํฐ๋ง ๋์ด ์ ์ฅ
- Primary Key ๊ฐ์ ์์๋๋ก ๋์คํฌ์ ์ ์ฅ
- Secondary Index๋ Primary Key ๊ฐ์ ๋ ผ๋ฆฌ์ ์ฃผ์๋ก ์ฌ์ฉ
- Primary Key๋ฅผ ์ด์ฉํ ๋ ์ธ์ง ์ค์บ์ ๋น ๋ฅธ ์๋๋ก ์ฒ๋ฆฌ
- ๋ ์ธ์ง ์ค์บ : ํ ์ด๋ธ์ ์ผ๋ถ(ํน์ ) ๋ ์ฝ๋์๋ง ์์ธ์คํด์ ์ฝ์ด๋ค์
- ์ฐธ๊ณ ์ฌ์ดํธ
- Query ์คํ ๊ณํ์์ Primary Key๊ฐ ๋ค๋ฅธ Index์ ๋นํด ๋น์ค์ด ๋์
- ์ค๋ผํด DBMS์ IOT(Index Organized Table)๊ณผ ๋์ผ ๊ตฌ์กฐ
MyISAM ํน์ง๊ณผ์ ๋น๊ต
- ํด๋ฌ์คํฐ๋ง ํค ์ง์ X
- Primary Key์ Secondary Index์ ๊ตฌ์กฐ์ ์ฐจ์ด X
- Primary Key : Unique ์ ์ฝ์ ๊ฐ์ง Index
- MyISAM ํ ์ด๋ธ์ ๋ชจ๋ ์ธ๋ฑ์ค๋ ๋ฌผ๋ฆฌ์ ์ธ ๋ ํฌ๋ ์ฃผ์ ๊ฐ(ROWID)์ ๊ฐ์ง
4.2.2 Foreign Key(์ธ๋ํค) ์ง์
Foreign Key(์ธ๋ํค) ๋?
Dead Lock(๋ฐ๋๋ฝ) ์ด๋?
- ์ฌ๋ฌ ๊ฐ์ Transaction(ํธ๋์ญ์ )๋ค์ด ์คํ์ ํ์ง ๋ชปํ๊ณ ์๋ก ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ
- ๋ถ๋ชจ ํ ์ด๋ธ๊ณผ ์์ ํ ์ด๋ธ ๋ชจ๋ ํด๋น Column์ Index ์์ฑ ํ์
- ๋ณ๊ฒฝ ์, ๋ฐ๋์ ๋ถ๋ชจ ํ
์ด๋ธ์ด๋ ์์ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธ ํ์
- ์ ๊ธ์ด ์ฌ๋ฌ ํ ์ด๋ธ๋ก ์ ํ๋๊ณ ๊ทธ๋ก ์ธํด ๋ฐ๋๋ฝ ๋ฐ์ ๊ฐ๋ฅ์ฑ ์์
- **foreign_key_checks** ๋ณ์ OFF : ์ธ๋ํค ๊ด๊ณ์ ๋ํ ์ฒดํฌ ์์ ์ ์ผ์์ ๋ฉ์ถค
4.2.3 MVCC (Multi Version Concurrency Control)
Concurrency Control(๋์์ฑ ์ ์ด) ๋?
- DBMS๊ฐ ๋ค์์ ์ฌ์ฉ์๋ก๋ถํฐ ๋์์ ์๋ํ๋ ๋ค์ค ํธ๋์ญ์ ์ ์ํธ๊ฐ์ญ ์์ฉ์์ DB๋ฅผ ๋ณดํธํ๋ ๊ฒ
- ๋์์ฑ์ ์ ์ดํ๊ธฐ ์ํด DBMS์์ Lock ๊ธฐ๋ฅ ์ ๊ณต
- ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ก์ธ์คํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง,
- ๋ด๋ถ์ ์ผ๋ก๋ ํ๋์ฉ ์คํ๋๋๋ก ํธ๋์ญ์ ์ ์ง๋ ฌํํ๋ ๊ฒ
- ๋ชฉ์
- ์คํ๋๋ ํธ๋์ญ์ ์๋ฅผ ์ต๋ํ
- ์ ๋ ฅ, ์์ , ์ญ์ , ๊ฒ์ ์ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์ง
- ๋ฌธ์ ์
- ์ฝ๊ธฐ ์์ ๊ณผ ์ฐ๊ธฐ ์์ ์ด ์๋ก ๋ฐฉํด๋ฅผ ์ผ์ผํค๊ธฐ ๋๋ฌธ์ ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒฝ์ฐ๋ ์กด์ฌ
- Lock์ ๋ ์ค๋ ์ ์งํ๊ฑฐ๋ ํ ์ด๋ธ ๋ ๋ฒจ์ Lock ์ฌ์ฉ์ผ๋ก, ๋์์ฑ ์ ํ๊ฐ ๋ฐ์
- MVCC ์ฐธ๊ณ
Undo Log ๋?
- ์คํ ์ทจ์ ๋ก๊ทธ ๋ ์ฝ๋์ ์งํฉ
- ํธ๋์ญ์ ์คํ ํ ๋กค๋ฐฑ ์ ์ด์ ๋ฐ์ดํฐ๋ก ๋ณต๊ตฌํ๋๋ก ๋ก๊น ํด๋์ ์์ญ
- ์ธ๋๋ก๊ทธ ์ฐธ๊ณ
MVCC์ ๋ชฉ์
- ์ผ๋ฐ์ ์ผ๋ก ๋ ์ฝ๋ ๋ ๋ฒจ์ ํธ๋์ญ์ ์ ์ง์ํ๋ DBMS๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ
- ์ ๊ธ์ ์ฌ์ฉํ์ง ์๋ ์ผ๊ด๋ ์ฝ๊ธฐ ์ ๊ณต
- InnoDB : Undo Log(์ธ๋๋ก๊ทธ)๋ก ๊ธฐ๋ฅ ๊ตฌํ
- Multi Version : ํ๋์ ๋ ์ฝ๋์ ๋ํด ์ฌ๋ฌ ๊ฐ์ ๋ฒ์ ์ด ๋์์ ๊ด๋ฆฌ๋จ์ ์๋ฏธ
- INSERT : ๋ฒํผ ํ ์ ์ฅ - ๋์คํฌ ์ ์ฅ
- UPDATE : ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ ์ธ๋ ๋ก๊ทธ ์ ์ฅ - ๋ฒํผ ํ ์์ - ๋์คํฌ ์์
- ์ดํ SELECT : ๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ๋ผ ๋ฒํผ ํ or ์ธ๋ ๋ก๊ทธ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋จ
- READ_UNCOMMITTED / READ_COMMITED๋ ๊ทธ ์ด์
- ์ฆ, ํ๋์ ๋ ์ฝ๋์ 2๊ฐ์ ๋ฒ์ ์ด ์ ์ง → ํ์์ ๋ฐ๋ผ ํ์๋๋ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฆ
Table(member){ id(PR), name, area } : { 12, 'MangKyu', '์์ธ' }
...
(InnoDB) mysql> UPDATE member SET m_area='๊ฒฝ๊ธฐ' WHERE m_id=12;
// Update ๋ด์ฉ์ Commit์ ์ํ๋ฉด SELECT๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋๋๊ฐ?
(InnoDB) mysql> SELECT * FROM member WHERE m_id=12;
4.2.4 Non-Locking Consistent Read (์ ๊ธ ์๋ ์ผ๊ด๋ ์ฝ๊ธฐ)
- MVCC ๊ธฐ์ ์ ์ด์ฉํด ์ ๊ธ์ ๊ฑธ์ง ์๊ณ ์ฝ๊ธฐ ์์
์ํ
- ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ฐ์ง๊ณ ์๋ ์ ๊ธ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ , ์ฝ๊ธฐ ์์ ๊ฐ๋ฅ
- ๊ฒฉ๋ฆฌ ์์ค์ด READ_UNCOMMITTED๋ READ_COMMITTED, REPEATABLE_READ ์์ค์ด๋ผ๋ฉด,
- INSERT์ ์ฐ๊ฒฐ๋์ง ์์ ์์ํ ์ฝ๊ธฐ(SELECT) ์์ ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋ณ๊ฒฝ ์์ ๊ณผ ๊ด๊ณ์์ด ํญ์ ์ ๊ธ์ ๋๊ธฐํ์ง ์๊ณ ๋ฐ๋ก ์คํ
- ํน์ ์ฌ์ฉ์๊ฐ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ์์ง ์ปค๋ฐ์ ์ํํ์ง ์์๋ค ํ๋๋ผ๋ ์ด ๋ณ๊ฒฝ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ์ฌ์ฉ์์ SELECT ์์ ์ ๋ฐฉํดํ์ง ์๋๋ค
- ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ํด ์ธ๋ ๋ก๊ทธ ์ฌ์ฉ
- ์ค๋ ์๊ฐ๋์ ํ์ฑ ์ํ์ธ ํธ๋์ญ์
์ผ๋ก ์ธํ MySQL ์๋ฒ ๋๋ฆผ ๋๋ ๋ฌธ์ ๋ฐ์ ์์
- ์ธ๋ ๋ก๊ทธ ์ญ์ ๋ฅผ ๋ชปํ๊ณ ์ ์ง๋ก ์ธํ ๋ฌธ์
- ๋กค๋ฐฑ ๋๋ ์ปค๋ฐ์ ํตํด ํธ๋์ญ์ ์ ๋น ๋ฅด๊ฒ ์๋ฃํ๋๋ก ํ๋๊ฒ ์ข๋ค
4.2.5 ์๋ ๋ฐ๋๋ฝ ๊ฐ์ง
- ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๊ธ ๋๊ธฐ ๊ทธ๋ํ๋ฅผ ๊ฒ์ฌ
- ๊ต์ฐฉ ์ํ์ ๋น ์ง ํธ๋์ญ์ ๋ค์ ์ฐพ์ ๊ทธ์ค ํ๋๋ฅผ ๊ฐ์ ์ข ๋ฃ
- ๋ด๋ถ์ ์ผ๋ก ์ ๊ธ์ด ๊ต์ฐฉ์ํ์ ๋น ์ง์ง ์์๋์ง ์ฒดํฌ
- ์ ๊ธ ๋๊ธฐ ๋ชฉ๋ก์ ๊ทธ๋ํ(Wait-for List)ํํ๋ก ๊ด๋ฆฌ
- ๊ฐ์ ์ข
๋ฃ ํ๋จ ๊ธฐ์ค : Undo Log์ ์
- ์ธ๋ ๋ก๊ทธ ๋ ์ฝ๋๋ฅผ ๋ ์ ๊ฒ ๊ฐ์ง ํธ๋์ญ์ ์ด ์ผ๋ฐ์ ์ผ๋ก ๋กค๋ฐฑ์ ๋์
- ์ธ๋ ๋ก๊ทธ ๋ ์ฝ๋๋ฅผ ์ ๊ฒ ๊ฐ์ง๋ฉด ๋กค๋ฐฑ์ ํด๋ ์ธ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ ๋ด์ฉ์ด ์ ๋ค๋ ๋ป
- ๊ฐ์ ๋กค๋ฐฑ์ผ๋ก ์ธํ ์๋ฒ ๋ถํ๋ ๋ ์ ๋ฐ
- MySQL ์์ง์์ ๊ด๋ฆฌ๋๋ ํ
์ด๋ธ ์ ๊ธ์ ๋ฐ๋๋ฝ ๊ฐ์ง๊ฐ ๋ถํ์คํด์ง ์ ์์
- innodb_table_locks์์คํ ๋ณ์๋ฅผ ํ์ฑํํ๋ฉด ๊ฐ์ง ๊ฐ๋ฅ
- ๋์ ์ฒ๋ฆฌ ์ค๋ ๋๊ฐ ๋ง๊ฑฐ๋, ํธ๋์ญ์
๋ค์ ์ ๊ธ์ด ๋ง์์ง๋ฉด ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋๊ฐ ๋๋ ค์ง
- ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋๊ฐ ์ ๊ธ ๋ชฉ๋ก์ด ์ ์ฅ๋ ๋ฆฌ์คํธ์ ์๋ก์ด ์ ๊ธ์ ๊ฑธ์ด ์ํ ๋ณ๊ฒฝ์ ๋ง๋๋ฐ, ์ด์ ๋ฐ๋๋ฝ ๊ฐ์ง ์ค๋ ๋๊ฐ ๋๋ ค์ง๋ฉด ์๋น์ค ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌ ์ค์ธ ์ค๋ ๋๊ฐ ์์ ๋ถ๊ฐ
- innodb_deadlock_detect : ๋ฐ๋๋ฝ ๊ฐ์ง ํ์ฑํ/๋นํ์ฑํ
- ์ ์ ํ ๋นํ์ฑํํ์ฌ CPU ์์ ์๋ชจ๋ฅผ ์ค์ด์
- innodb_lock_wait_timeout : ๋ฐ๋๋ฝ ์ํฉ์ ์ผ์ ์๊ฐ(์ด)์ด ์ง๋๋ฉด ์๋ฌ ๋ฉ์์ง ๋ฐํ
4.2.6 ์๋ํ๋ ์ฅ์ ๋ณต๊ตฌ
- InnoDB ๋ฐ์ดํฐ ํ์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก MySQL์๋ฒ๊ฐ ์์๋ ๋ ํญ์ ์๋ ๋ณต๊ตฌ ์ํ
- ์ด ๋ ๋ณต๊ตฌ๋ ์ ์๋ ์์์ด ์์ผ๋ฉด ์๋ฒ ์ข ๋ฃ
- innodb_force_recovery : ๋ณต๊ตฌ ์ต์ ์ ๋ํ ๋ณ์ (์ค์ ๊ฐ : 1~6)
- ๋ณต๊ตฌ ์ต์
- 1(SRV_FORCE_IGNORE_CORRUPT)
- ์์๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ๊ฒฌ๋๋ ๋ฌด์ํ๊ณ MySQL ์๋ฒ๋ฅผ ์์
- 2(SRV_FORCE_NO_BACKGROUND)
- ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์์ํ์ง ์๊ณ MySQL ์๋ฒ๋ฅผ ์์
- 3(SRV_FORCE_NO_TRX_UNDO)
- MySQL ์๋ฒ๊ฐ ์์ํ ๋ ์ด์ ์ ์๋ฃ๋์ง ์์ ํธ๋์ญ์ ๋ณต๊ตฌ ์์ ์ ๋์ํ์ง ์๊ฒํจ
- 4(SRV_FORCE_NO_IBUF_MERGE)
- Insert Buffer ๋ด์ฉ์ ๋ฌด์ํ๊ณ MySQL ์๋ฒ๋ฅผ ์์
- 5(SRV_FORCE_NO_UNDO_LOG_SCAN)
- Undo log ๋ฅผ ๋ฌด์ํ๊ณ MySQL ์๋ฒ๋ฅผ ์์
- 6(SRV_FORCE_NO_LOG_REDO)
- Redo log ๋ฅผ ๋ฌด์ํ๊ณ MySQL ์๋ฒ๋ฅผ ์์
- 1(SRV_FORCE_IGNORE_CORRUPT)
4.2.7 InnoDB ๋ฒํผ ํ
Buffer Pool
- ๋์คํฌ์ ๋ฐ์ดํฐ ํ์ผ์ด๋ ์ธ๋ฑ์ค ์ ๋ณด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ํด ๋๋ ๊ณต๊ฐ
- ์ฐ๊ธฐ ์์ ์ ์ง์ฐ์์ผ ์ผ๊ด ์์ ์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋๋ก ํจ
- INSERT, UPDATE, DELETE์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฟผ๋ฆฌ๋ ๋๋คํ ๋์คํฌ ์์
๋ฐ์
- Buffer Pool์ ์ด๋ฌํ ๋ณ๊ฒฝ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์์ ์ฒ๋ฆฌ → ๋๋คํ ๋์คํฌ ์์ ํ์ ํ๋ฝ
๋ฒํผ ํ์ ํฌ๊ธฐ ์ค์
- ์ด์์ฒด์ ์ ๊ฐ ํด๋ผ์ด์ธํธ ์ค๋ ๋๊ฐ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถฉ๋ถํ ๊ณ ๋ คํด ์ค์
- 8GB ๋ฏธ๋ง : 50% ์ ๋๋ง InnoDB ๋ฒํผ ํ ํฌ๊ธฐ๋ก ์ค์ ํ๊ณ , ์กฐ๊ธ์ฉ ์ฌ๋ฆฌ๋ฉด์ ์ต์ ์ ์ ์ฐพ๊ธฐ
- 50GB ์ด์ : 20~35GB ์ ๋๋ฅผ InnoDB ๋ฒํผ ํ ํฌ๊ธฐ๋ก ์ค์
- Record Buffer(๋ ์ฝ๋ ๋ฒํผ)
- ๊ฐ ํด๋ผ์ด์ธํธ ์ธ์ ์์ ํ ์ด๋ธ ๋ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ธ ๋ ๋ฒํผ๋ก ์ฌ์ฉํ๋ ๊ณต๊ฐ
- ์ปค๋ฅ์ ๊ณผ ์ฌ์ฉํ๋ ํ ์ด๋ธ์ด ๋ง๋ค๋ฉด ๋ ์ฝ๋ ๋ฒํผ ์ฉ๋๋ก ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ง์ด ํ์
MySQL ์๋ฒ๊ฐ ์ฌ์ฉํ๋ ๋ ์ฝ๋ ๋ฒํผ ๊ณต๊ฐ์ ๋ณ๋๋ก ์ค์ ํ ์ ์์- ์ ์ฒด ์ปค๋ฅ์ ๊ฐ์์ ๊ฐ ์ปค๋ฅ์ ์์ ์ฝ๊ณ ์ฐ๋ ํ ์ด๋ธ ๊ฐ์์ ๋ฐ๋ผ ๊ฒฐ์
- ๋์ ์ผ๋ก ํด์ ๊ฐ๋ฅ
- InnoDB ๋ฒํผ ํ์ ํฌ๊ธฐ๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ๊ฐ๋ฅ(MySQL 5.7 ์ดํ)
- innodb_buffer_pool_size : ๋ฒํผ ํ ํฌ๊ธฐ ์ค์ (128MB ๋จ์ ์ฒ๋ฆฌ)
- innodb_buffer_pool_instances : ๋ฒํผ ํ์ ์ฌ๋ฌ ๊ฐ๋ก ๋ถ๋ฆฌํด ํ ๋น
๋ฒํผ ํ์ ๊ตฌ์กฐ
- ๋ฒํผ ํ์ ๋์คํฌ์์ ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ์ฝ๊ณ , ๊ณต๊ฐ์ ํ์ด์ง ๋จ์๋ก ์ชผ๊ฐ์ด ์ ์ฅ
- ๋ฒํผ ํ์ ํ์ด์ง ํฌ๊ธฐ ์กฐ๊ฐ ๊ด๋ฆฌ๋ฅผ ์ํ ์๋ฃ๊ตฌ์กฐ (3๊ฐ)
- LRU(Least Recently Used) ๋ฆฌ์คํธ
- Flush(ํ๋ฌ์) ๋ฆฌ์คํธ
- Free(ํ๋ฆฌ) ๋ฆฌ์คํธ
- ๋น์ด ์๋ ํ์ด์ง ๋ชฉ๋ก, ์๋กญ๊ฒ ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ์ฝ์ด์์ผ ํ ๋ ์ฌ์ฉ
LRU ๋ฆฌ์คํธ
Page(ํ์ด์ง) ๋?
- ๋์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ ๋จ์ (16KB ๊ณ ์ )
- LRU์ MRU(Most Recently Used) ๋ฆฌ์คํธ๊ฐ ๊ฒฐํฉ๋ ํํ
- LRU : ๊ฐ์ฅ ์ค๋ ์ ์ฌ์ฉ๋ ํ์ด์ง ๋ฆฌ์คํธ **Old ์๋ธ๋ฆฌ์คํธ**
- MRU : ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉ๋ ํ์ด์ง ๋ฆฌ์คํธ **New ์๋ธ๋ฆฌ์คํธ**
- ๋ฒํผ ํ์์ ์์ฃผ ์ฌ์ฉ๋๋ ํ์ด์ง๋ ์์๋ก, ์์ฃผ ์ฌ์ฉ๋์ง ์๋ ํ์ด์ง๋ ํ์๋ก ์ด๋
- LRU ๋ฆฌ์คํธ ๊ด๋ฆฌ ๋ชฉ์
- ๋์คํฌ ์ฝ๊ธฐ ์ต์ํ
- ๋์คํฌ๋ก๋ถํฐ ํ ๋ฒ ์ฝ์ด์จ ํ์ด์ง๋ฅผ ์ต๋ํ ์ค๋ซ๋์ ๋ฒํผ ํ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง
- ๋์คํฌ ์ฝ๊ธฐ ์ต์ํ
- LRU ๊ณผ์
- ํ์ํ ๋ ์ฝ๋๊ฐ ์ ์ฅ๋ ๋ฐ์ดํฐ ํ์ด์ง๊ฐ ๋ฒํผ ํ์ ์๋์ง ๊ฒ์ฌ
- ๋์คํฌ์์ ํ์ํ ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ๋ฒํผ ํ์ ์ ์ฌ, ์ ์ฌ๋ ํ์ด์ง์ ๋ํ ํฌ์ธํฐ๋ฅผ LRU ํค๋์ ์ถ๊ฐ
- ๋ฒํผ ํ์ LRU ํค๋์ ์ ์ฌ๋ ๋ฐ์ดํฐ ํ์ด์ง๊ฐ ์ค์ ๋ก ์ฝํ๋ฉด MRU ํค๋๋ก ์ด๋
- ๋ฒํผ ํ์ ์์ฃผํ๋ ๋ฐ์ดํฐ ํ์ด์ง๋ ์ฌ์ฉ์ ์ฟผ๋ฆฌ์ ์ต๊ทผ ์ ๊ทผ ๋น๋์ ๋ฐ๋ผ ๋์ด ๋ถ์ฌ
- ๋ฒํผ ํ์ ์์ฃผํ์ง๋ง ์ฟผ๋ฆฌ์์ ์ค๋ซ๋์ ์ฌ์ฉ๋์ง ์์ ๋ฐ์ดํฐ ํ์ด์ง๋ ๋์ด๊ฐ ์ค๋๋จ
- ๊ฒฐ๊ตญ ํด๋น ํ์ด์ง๋ ๋ฒํผ ํ์์ ์ ๊ฑฐ
- ์ฟผ๋ฆฌ์ ์ํด ์ฌ์ฉ๋ ๋ฐ์ดํฐ ํ์ด์ง๋ ๋์ด๊ฐ ์ด๊ธฐํ๋์ด MRU ํค๋๋ก ์ด๋
- ํ์ํ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ์ ๊ทผ๋๋ค๋ฉด ํด๋น ํ์ด์ง์ ์ธ๋ฑ์ค ํค๋ฅผ ์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค์ ์ถ๊ฐ
Flush ๋ฆฌ์คํธ
- ๋์คํฌ์ ๋๊ธฐํ ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ํ์ด์ง์ ๋ณ๊ฒฝ ์์ ๊ธฐ์ค์ ํ์ด์ง ๋ชฉ๋ก์ ๊ด๋ฆฌ
- ์ง์ฐ ์ฐ๊ธฐ๋ก ์ธํด UPDATE ์ฟผ๋ฆฌ ์คํ ์ ๋ฐ์ํ ๋ณ๊ฒฝ์ฌํญ์ด ๋์คํฌ์ ์ฆ์ ๋ฐ์์ด ์๋จ
- ํ ๋ฒ ๋ณ๊ฒฝ ๋ ๋ฐ์ดํฐ ํ์ด์ง๋ ํ๋ฌ์ ๋ฆฌ์คํธ์์ ๊ด๋ฆฌ
- ํน์ ์์ ํ, ๋์คํฌ๋ก ๊ธฐ๋ก๋จ
- ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฆฌ๋ ๋ก๊ทธ์ ๊ธฐ๋ก
- ๋ฒํผ ํ์ ๋ฐ์ดํฐ ํ์ด์ง์๋ ๋ณ๊ฒฝ ๋ด์ฉ ๋ฐ์
- ๋ฆฌ๋ ๋ก๊ทธ์ ๊ฐ ์ํธ๋ฆฌ๋ ํน์ ๋ฐ์ดํฐ ํ์ด์ง์ ์ฐ๊ฒฐ
- ๋์ด ๋ถ์ผ์น ํ๋ฉด, ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ฐ์
- ๋์คํฌ์ ๋ฆฌ๋ ๋ก๊ทธ์ ๋ฐ์ดํฐํ์ด์ง์ ์ํ๋ฅผ ๋๊ธฐํํจ.
- ์ฒดํฌํฌ์ธํธ : ๋ฆฌ๋ ๋ก๊ทธ์ ์ด๋ ๋ถ๋ถ๋ถํฐ ๋ณต๊ตฌ๋ฅผ ์คํํ ์ง ํ๋จ ๊ธฐ์ค
๋ฒํผ ํ๊ณผ Redo Log(๋ฆฌ๋ ๋ก๊ทธ)
Redo Log ๋?
- DB์ ์๊ธด ๋ณ๊ฒฝ ์ด๋ ฅ์ ๊ธฐ๋กํด๋์ ํ์ผ
- ๋ง์ฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊นจ์ด์ง ๊ฒฝ์ฐ, ๋ฆฌ๋ ๋ก๊ทธ์ ๋จ๊ฒจ์ง ๊ธฐ๋ก์ ์ด์ฉํ์ฌ ์๋ ์ํ๋ก ๋ณต๊ตฌ
- Redo Log ์ฐธ๊ณ
- ๋ฒํผ ํ์๋ Clean Page์ Dirty Page๊ฐ ์กด์ฌ
- Clean Page(ํด๋ฆฐ ํ์ด์ง) : ๋์คํฌ์์ ์ฝ์ ์ํ๋ก ์ ํ ๋ณ๊ฒฝ๋์ง ์์ ํ์ด์ง
- Dirty Page(๋ํฐ ํ์ด์ง) : INSERT, UPDATE, DELETE ๋ช ๋ น์ผ๋ก ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ํ์ด์ง
- ๋ํฐ ํ์ด์ง๋ ๋์คํฌ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ์ํ๊ฐ ๋ค๋ฅด๋ฏ๋ก ์ธ์ ๊ฐ๋ ๋์คํฌ๋ก ๊ธฐ๋ก๋์ผํจ
- ๋จ, ๋ฌดํ์ ๋๊ธฐํ ์ ์์ผ๋ฏ๋ก ๋ฆฌ๋ ๋ก๊ทธ๋ฅผ ํตํด ๊ด๋ฆฌ
- ๋ฆฌ๋ ๋ก๊ทธ๋ ํ๋์ ๊ณ ์ ํฌ๊ธฐ์ ํ์ผ์ ์ํ ํํ๋ก ์ฐ๊ฒฐํด์ ์ฌ์ฉ
- ์ด๋ ์๊ฐ ์ฌ์ฉ์ค์ธ ๊ณต๊ฐ์ ๋ฎ์ด ์ธ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ถ์ด ํ์
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅ ๊ณต๊ฐ, ๋น์ฅ ์ฌ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ ๊ณต๊ฐ
- ์ฌ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ ๊ณต๊ฐ : Active Redo Log(ํ์ฑ ๋ฆฌ๋ ๋ก๊ทธ)
- ์ด๋ ์๊ฐ ์ฌ์ฉ์ค์ธ ๊ณต๊ฐ์ ๋ฎ์ด ์ธ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ถ์ด ํ์
- LSN(LogSequence Number)
- ํ๋์ ํ์ผ์ ์ํํ๋ฉด์ ์ฌ์ฌ์ฉ๋์ง๋ง, ๋ก๊ทธ ํฌ์ง์ ์ ๊ณ์ ์ฆ๊ฐ
- ํ์ฑ ๋ฆฌ๋ ๋ก๊ทธ ๊ณต๊ฐ์ ์์์
- ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ๊ธฐ๋ก ์, ๊ฐ์ฅ ์ต๊ทผ ์ฒดํฌํฌ์ธํฐ ์์ ์ LSN
- Checkpoint Age(์ฒดํฌํฌ์ธํธ ์์ด์ง)
- ๊ฐ์ฅ ์ต๊ทผ ์ฒดํฌํฌ์ธํธ์ LSN๊ณผ ๋ง์ง๋ง ๋ฆฌ๋ ๋ก๊ทธ ์ํธ๋ฆฌ์ LSN์ ์ฐจ์ด
- ํ์ฑ ๋ฆฌ๋ ๊ณต๊ฐ์ ํฌ๊ธฐ
- ์ฒดํฌํฌ์ธํธ์ LSN๋ณด๋ค ์์ ๋ฆฌ๋ ๋ก๊ทธ ์ํธ๋ฆฌ์ ๊ด๋ จ๋ ๋ํฐ ํ์ด์ง๋ค์ ๋์คํฌ์ ๋๊ธฐํ
Buffer Pool Flush(๋ฒํผ ํ ํ๋ฌ์)
Flush(ํ๋ฌ์)
๋ณ๊ฒฝ ์ฌํญ์ DBํ์ผ์ ๊ธฐ๋กํ๊ธฐ ์ํด, ๋ฉ๋ชจ๋ฆฌ ๋๋ ์์ ๋์คํฌ ์คํ ๋ฆฌ์ง ์์ญ์ ๋ฒํผํ๋ ๊ฒ
- ๋ฒํผ ํ์์ ๋ํฐ ํ์ด์ง๋ค์ ์ฑ๋ฅ์ ์
์ํฅ ์์ด ๋์คํฌ์ ๋๊ธฐํ๋ฅผ ์ํ ๊ธฐ๋ฅ
- Flush_list Flush(ํ๋ฌ์ ๋ฆฌ์คํธ ํ๋ฌ์)
- LRU_list Flush(LRU ๋ฆฌ์คํธ ํ๋ฌ์)
Flush_list Flush(ํ๋ฌ์ ๋ฆฌ์คํธ ํ๋ฌ์)
- ์ค๋๋ ๋ฆฌ๋ ๋ก๊ทธ ๊ณต๊ฐ์ ์ง์ฐ๊ธฐ ์ํด์๋ ๋ํฐ ํ์ด์ง๊ฐ ๋์คํฌ์ ๋๊ธฐํ ๋์ผํจ
- ํ๋ฌ์ ๋ฆฌ์คํธ ํ๋ฌ์ ํจ์ ํธ์ถ
- ํ๋ฌ์ ๋ฆฌ์คํธ์์ ์ค๋์ ์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ ํ์ด์ง ์์๋๋ก ๋์คํฌ์ ๋๊ธฐํ
- ์์คํ ๋ณ์ ์ ๊ณต
- Cleaner Thread(ํด๋ฆฌ๋ ์ค๋ ๋)
- ๋ํฐ ํ์ด์ง๋ฅผ ๋์คํฌ๋ก ๋๊ธฐํ ํ๋ ์ค๋ ๋
- innodb_page_cleaners : ํด๋ฆฌ๋ ์ค๋ ๋์ ๊ฐ์ ์กฐ์
- innodb_buffer_pool_instances์ ๋์ผํ ๊ฐ์ผ๋ก ํ๋ค.
- ํ๋์ ํด๋ฆฌ๋ ์ค๋ ๋๊ฐ ํ๋์ ๋ฒํผ ํ ์ธ์คํด์ค๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ค์ ํ๋ฉด ์ข์
- ๋ํฐ ํ์ด์ง์ ํด๋ฆฐ ํ์ด์ง์ ๋น์จ ์กฐ์
- innodb_max_dirty_pages_pct : ๋ํฐ ํ์ด์ง์ ํด๋ฆฐ ํ์ด์ง์ ๋น์จ์ ์ ํจ (๊ธฐ๋ณธ๊ฐ์ด ์ข์)
- ๋ง์ ๋ํฐ ํ์ด์ง๋ฅผ ๊ฐ์ง๋ฉด ๋ฒํผ๋ง์ด ํจ์จ์ ์ข์์ง
- ํ์ง๋ง, ํ๋ฒ์ ๋์คํฌ ์ฐ๊ธฐ๋ฅผ ํ๋ฉด ๋์คํฌ ์ฐ๊ธฐ ํญ๋ฐ์ด ๋ฐ์ํ ์ ์์
- innodb_max_dirty_pages_pct_lwm : ๊ธฐ์ค ์ด์ ๋ํฐ ํ์ด์ง ๋ฐ์ → ์กฐ๊ธ์ฉ ๋์คํฌ๋ก ๊ธฐ๋ก
- innodb_max_dirty_pages_pct : ๋ํฐ ํ์ด์ง์ ํด๋ฆฐ ํ์ด์ง์ ๋น์จ์ ์ ํจ (๊ธฐ๋ณธ๊ฐ์ด ์ข์)
- DB์๋ฒ์์ ๋์คํฌ ์ฝ๊ณ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ ์ ๋ ์ค์
- ๋์คํฌ ์ฝ๊ณ ์ฐ๊ธฐ : ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๊ฐ ์ํํ๋ ๋์คํฌ ์์ (๋ฒํผ ํ์ ๋ํฐ ํ์ด์ง ์ฐ๊ธฐ)
- innodb_io_capacity : ์ผ๋ฐ ์ํฉ์์ ๋์คํฌ๊ฐ ์ ์ ํ ์ฒ๋ฆฌํ ์ ์๋ ์์ค์ ๊ฐ ์ค์
- innodb_io_capacity_max : ๋์คํฌ๊ฐ ์ต๋ ์ฑ๋ฅ์ ๋ฐํํ ๋ Read/Write ์ฒ๋ฆฌ ์์ค ๊ฐ ์ค์
- Adaptive Flush(์ด๋ํฐ๋ธ ํ๋ฌ์)
- ๋ํฐ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํด DB๊ฐ ์ ์ ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฒ๋ฆฌ
- ๋ฆฌ๋ ๋ก๊ทธ์ ์ฆ๊ฐ ์๋๋ฅผ ๋ถ์
- ์ ์ ํ ์์ค์ ๋ํฐ ํ์ด์ง๊ฐ ๋ฒํผ ํ์ ์ ์ง๋ ์ ์๋๋ก ๋์คํฌ ์ฐ๊ธฐ ์คํ
- innodb_adaptive_flushing : ํ์ฑํ/๋นํ์ฑํ ๊ธฐ์ค
- innodb_adaptive_flushing_lwm (๊ธฐ๋ณธ๊ฐ : 10%)
- ์ ์ฒด ๋ฆฌ๋ ๋ก๊ทธ ๊ณต๊ฐ ไธญ ํ์ฑ ๋ฆฌ๋ ๋ก๊ทธ ๊ณต๊ฐ์ด ์ค์ ๊ฐ ์ด์์ด๋ฉด ์๊ณ ๋ฆฌ์ฆ ์คํ
- ๋ํฐ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํด DB๊ฐ ์ ์ ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฒ๋ฆฌ
- innodb_flush_neighbor
- ๋ํฐ ํ์ด์ง์ ๋์คํฌ ๋๊ธฐํ ๋ ๋ฐ์
- ๋์คํฌ์์ ๊ทผ์ ํ ํ์ด์ง ์ค ๋ํฐ ํ์ด์ง๊ฐ ์๋ค๋ฉด ํจ๊ป ๋ฌถ์ด์ ๋์คํฌ๋ก ๊ธฐ๋กํ๋ ๊ธฐ๋ฅ
LRU ๋ฆฌ์คํธ ํ๋ฌ์
- LRU ๋ฆฌ์คํธ์์ ์ฌ์ฉ ๋น๋๊ฐ ๋ฎ์ ๋ฐ์ดํฐ ํ์ด์ง ์ ๊ฑฐ๋ฅผ ํตํด ์๋ก์ด ํ์ด์ง ์ฝ์ ๊ณต๊ฐ ์ฐฝ์กฐ
- innodb_lru_scan_depth : LRU ๋ฆฌ์คํธ ๋๋ถํฐ ํด๋น ๊ธฐ์ค๊น์ง ํ์ด์ง ์ค์บ
- ์ค์บ๋ ๋ํฐ ํ์ด์ง๋ ๋์คํฌ์ ๋๊ธฐํ
- ํด๋ฆฐ ํ์ด์ง๋ ์ฆ์ ํ๋ฆฌ ๋ฆฌ์คํธ๋ก ์ด์
๋ฒํผ ํ ์ํ ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ
- Warming Up(์๋ฐ์
)
- ๋์คํฌ์ ๋ฐ์ดํฐ๊ฐ ๋ฒํผ ํ์ ์ ์ฌ๋ผ ์๋ ์ํ
- ์๋ฐ์ ์ด ๋ ์ํ์ ์ ๋ ์ํ๋ ๋ช์ญ ๋ฐฐ์ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ์๋๊ฐ ๋จ
- ๋ฒํผ ํ์ ์บ์๋ฅผ ํตํด ์ฟผ๋ฆฌ๋ค์ ์๋๋ฅผ ํฅ์์ํด
- ์๋ฒ ์ฌ์์ ์ ๋ฒํผ ํ์ด ๋ ๋ผ๊ฐ ์๋๊ฐ ๋๋ ค์ง
- ๊ธฐ์กด์๋ ์๋ฐ์ ์ด๋ ์์ ์ผ๋ก ์๋น์ค ์ ์์๋ก ๋ฒํผ ํ์ ์บ์ํด์ค
- MySQL 5.6 ์ดํ, ๋ฒํผํ ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ๋ฅผ ํตํด ํด๊ฒฐ
- ์ฝ๋
// ์๋ฒ ์
ง๋ค์ด ์ , ๋ฒํผ ํ ์ํ ๋ฐฑ์
mysql> SET GLOBAL innodb_buffer_pool_dump_now=ON;
...
// ์๋ฒ ์ฌ์์ ํ, ๋ฐฑ์
๋ ๋ฒํผ ํ ์ํ ๋ณต๊ตฌ
mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
...
// ๋ฒํผ ํ ๋ณต๊ตฌ ์ํ ํ์ธ
mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status'\G
...
// ๋ฒํผ ํ ๋ณต๊ตฌ ์์
์ด ์ค๋ ๊ฑธ๋ ค์ ์ค๊ฐ์ ๋ฉ์ถ๊ธฐ ์ํ ๋ฐฉ๋ฒ
mysql> SET GLOBAL innodb_buffer_pool_load_abort=ON;
๋ฒํผ ํ์ ์ ์ฌ ๋ด์ฉ ํ์ธ
- MySQL 5.6 ์ดํ
- ๋ฒํผ ํ์ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ค ํ
์ด๋ธ์ ํ์ด์ง๋ค์ด ์ ์ฌ๋ผ ์๋์ง ํ์ธ ๋ฐฉ๋ฒ
- MySQL ์๋ฒ์ information_schema DB์ innodb_buffer_page ํ ์ด๋ธ ์ด์ฉ
- ํ์ง๋ง ๋ฒํผ ํ์ด ํฐ ๊ฒฝ์ฐ, ํ ์ด๋ธ ์กฐํ์ ์๋นํ ํฐ ๋ถํ๋ฅผ ์ผ์ผํด → ๋๋ ค์ง
- ๋ฒํผ ํ์ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ค ํ
์ด๋ธ์ ํ์ด์ง๋ค์ด ์ ์ฌ๋ผ ์๋์ง ํ์ธ ๋ฐฉ๋ฒ
- MySQL 8.0 ์ดํ
- information_schema DB์ innodb_cached_indexes ํ ์ด๋ธ ์๋ก ์ถ๊ฐ
- ํ ์ด๋ธ์ ์ธ๋ฑ์ค ๋ณ๋ก ๋ฐ์ดํฐ ํ์ด์ง๊ฐ ์ผ๋ง๋ ๋ฒํผ ํ์ ์ ์ฌ๋ผ ์๋์ง ํ์ธ ๊ฐ๋ฅ
mysql>
SELECT
it.name table_name,
ii.name index_name,
ici.n_cached_pages n_cached_pages
FROM information_schema.innodb_tables it
INNER JOIN information_schema.innodb_indexes ii ON ii.table_id=it.table_id
INNER JOIN information_schema.innodb_cached_indexes ici ON ici.index_id=ii.index_id
WHERE it.name=CONCAT('employees','/','employees')
4.2.8 Double Write Buffer
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๋ฆฌ๋ ๋ก๊ทธ๋ ๋ฆฌ๋ ๋ก๊ทธ ๊ณต๊ฐ์ ๋ญ๋น๋ฅผ ๋ง๊ธฐ ์ํด ํ์ด์ง์ ๋ณ๊ฒฝ๋ ๋ด์ฉ๋ง ๊ธฐ๋กํ๋ค. ์ด๊ฒ์ ๋ํฐ ํ์ด์ง๋ผ๊ณ ํ๋๋ฐ ๋ํฐ ํ์ด์ง๋ฅผ ๋์คํฌ ํ์ผ๋ก ํ๋ฌ์ํ๋ค. ํ์ง๋ง, ๋น์ ์์ ์ธ ์ํฉ(MySQL ์๋ฒ๊ฐ ์ข ๋ฃ๋๊ฑฐ๋ ํ๋๋์คํฌ์ ๋ฌธ์ ๊ฐ ๋ฐ์)์๋ ๋ํฐ ํ์ด์ง๊ฐ ์ผ๋ถ๋ถ๋ง ์ ์ฅ๋์ด ๋ณต๊ตฌ๋ฅผ ํ ์ ์๊ฒ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ง๊ธฐ ์ํด Double Write Buffer๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ๋ฆผ์ ๋ณด๋ฉด, A,B,C,D์ ๋ํฐ ํ์ด์ง๋ฅผ ๋์คํฌ๋ก ํ๋ฌ์๋ฅผ ํ๋ค๊ณ ๊ฐ์ ํ์ ๋.
- A~D๊น์ง ๋ํฐ ํ์ด์ง๋ฅผ ์ฐ์ ๋ฌถ์ด์ ํ๋ฒ์ ๋์คํฌ ์ฐ๊ธฐ๋ก ์์คํ ํ ์ด๋ธ ์คํ์ด์ค์ DoubleWrite ๋ฒํผ์ ๊ธฐ๋กํ๋ค.
- InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๊ฐ ๋ํฐ ํ์ด์ง๋ฅผ ํ์ผ์ ์ ๋นํ ์์น์ ํ๋์ฉ ๋๋ค์ผ๋ก ์ฐ๊ธฐ๋ฅผ ์คํํ๋ค.
๐ก Double Write Buffer์ ๋ด์ฉ์ ์ค์ ๋ฐ์ดํฐ ํ์ผ ์ฐ๊ธฐ๋ฅผ ์คํจํ ๋ ๋ณต๊ตฌํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก, ์์ ์ฑ์ ์ํด ์ฌ์ฉ๋๋ค.
์ค์ ๋์คํฌ์ ๋ํฐ ํ์ด์ง๋ค์ด ์ ์์ ์ผ๋ก ์ ์ฅ์ด ๋๋ฉด, Double Write ๋ฒํผ์ ๊ธฐ๋ก๋ ํ์ด์ง๋ค์ ํ์๊ฐ ์์ด์ง๋ค.
- innodb_doublewrite: ํด๋น ์์คํ ๋ณ์๋ก DoubleWrite์ ์ฌ์ฉ์ฌ๋ถ๋ฅผ ์ค์ ํ ์ ์๋ค.
- innodb_flush_log_at_trx_commit: innoDB ๋ฆฌ๋ ๋ก๊ทธ ๋๊ธฐํ ์ค์ ์ 1๋ก ํ์ง ์์์ ๊ฒฝ์ฐ์๋ DoubleWrite๋ฅผ ํจ๊ป ๊บผ์ฃผ๋๊ฒ ์๋ฒ ์ฑ๋ฅ ํฅ์์ ๋์์ด ๋๋ค.
4.2.9 ์ธ๋ ๋ก๊ทธ
๐ก DML(insert, update, delete)์ ์คํํ ๋ค, ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๋ฒ์ ์ ๋ณ๋๋ก ๋ฐฑ์ ํ๋๋ฐ ์ด๋ฅผ ์ธ๋ ๋ก๊ทธ๋ผ๊ณ ํ๋ค.
- ํธ๋์ญ์
๋ณด์ฅ
- ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋๋ฉด ์ด์ ๋ฐ์ดํฐ๋ก ์ฎ๊ฒจ์ผํ๋๋ฐ ๋ฐ๋ก ์ธ๋ ๋ก๊ทธ๋ฅผ ์ด์ฉํด ๋ณต๊ตฌํ๋ค. (ํธ๋์ญ์ ๋กค๋ฐฑ ๋๋น์ฉ)
- ๊ฒฉ๋ฆฌ ์์ค ๋ณด์ฅ
- ์๋ก ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋์ผํ ๋ฐ์ดํฐ ์์ , ์กฐํ๋ฅผ ๋์์ ํ ๋, ์ธ๋ ๋ก๊ทธ์ ๋ฐฑ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ๋ฐํํ๋ค. (REPEATABLE READ)
๋์๊ณผ์
mysql> UPDATE member SET name = 'abc' WHERE member_id=1;
- ์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ฉด, ํธ๋์ญ์
์ ์ปค๋ฐํ์ง ์์๋ ์ค์ ๋ฐ์ดํฐ ํ์ผ์ ‘abc’๋ก ๋ณ๊ฒฝ๋๋ค.
- ! ์ค์ ๋ฐ์ดํฐ ํ์ผ์ด ๋ฒํผ ํ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋์ง, ๋์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋์ง ์ฐพ์๋ณด๊ธฐ.
- ๋ง์ฝ ๋ณ๊ฒฝ๋๊ธฐ ์ ๋ฐ์ดํฐ๊ฐ ‘def’ ์๋ค๋ฉด, ์ธ๋ ๋ก๊ทธ์๋ ‘def’๋ผ๋ ๊ฐ์ผ๋ก ๋ฐฑ์ ๋์์ ๊ฒ์ด๋ค.
- ํธ๋์ญ์ ์ด ์ปค๋ฐ์ด ๋๋ฉด → ํ์ฌ ์ํ ์ ์ง (’abc’)
- ํธ๋์ญ์ ์ด ๋กค๋ฐฑ์ด ๋๋ฉด → ์ธ๋ ๋ก๊ทธ์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ณต๊ตฌ (’def’)
๋์ ๋น์ฉ
MySQL 5.5 ์ด์ ๋ฒ์ ์์๋ ํ๋ฒ ์ฆ๊ฐํ ์ธ๋ ๋ก๊ทธ ๊ณต๊ฐ์ ์ค์ด๋ค์ง ์์๋ค.
- ์๋ฅผ ๋ค์ด, 100GB ํฌ๊ธฐ์ ํ ์ด๋ธ์ DELETE๋ก ์ญ์ ํ ๋
- ๋ ์ฝ๋ ํ๊ฑด์ ์ญ์ ํ๊ณ ์ธ๋ ๋ก๊ทธ์ ๋ฐฑ์ …
100GB ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ์ง๋ง, ๊ทธ ๋งํผ์ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ ๋ก๊ทธ์ ๋ฐฑ์ ํด๋ฌ์ผ ํ๋ค. ๊ฒฐ๊ตญ ์ธ๋ ๋ก๊ทธ์ ๊ณต๊ฐ์ด 100GB๊ฐ ๋๋ ๋ถ์์ฌ๊ฐ ์ผ์ด๋๋ ๊ฒ์ด๋ค.
ํ์ง๋ง, MySQL 8.0์์๋ ์ธ๋ ๋ก๊ทธ๋ฅผ ๋์๊ฐ๋ฉด์ ์์ฐจ์ ์ผ๋ก ์ฌ์ฉํด ๋์คํฌ ๊ณต๊ฐ์ ์ค์ด๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฉฐ, ๋๋ก๋ MySQL ์๋ฒ๊ฐ ํ์ํ ์์ ์ ์ฌ์ฉ ๊ณต๊ฐ์ ์๋์ผ๋ก ์ค์ฌ์ฃผ๊ธฐ๋ ํ๋ค.
4.2.9.2 ์ธ๋ ํ ์ด๋ธ์คํ์ด์ค ๊ด๋ฆฌ
๐ก ์ธ๋ ๋ก๊ทธ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ ์ธ๋ ํ ์ด๋ธ ์คํ์ด์ค๋ผ๊ณ ํ๋ค.
- ~ MySQL 5.6 : ์ธ๋ ๋ก๊ทธ๊ฐ ๋ชจ๋ ์์คํ
ํ
์ด๋ธ์คํ์ด์ค (ibdata.ibd)์ ์ ์ฅ ๋์์
- ์์คํ ํ ์ด๋ธ์คํ์ด์ค๋ ์๋ฒ๊ฐ ์ด๊ธฐํ๋ ๋ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ํ์ฅ์ ํ๊ณ๊ฐ ์์์
- MySQL 8.0.14 ~ : ์ธ๋ ๋ก๊ทธ๋ ํญ์ ์์คํ ํ ์ด๋ธ์คํ์ด์ค ์ธ๋ถ์ ๋ณ๋ ๋ก๊ทธ ํ์ผ์ ๊ธฐ๋ก๋๋๋ก ๊ฐ์ ๋์๋ค.
Undo tablespace truncate
๐ก ์ธ๋ ํ ์ด๋ธ์คํ์ด์ค ๊ณต๊ฐ์ ํ์ํ ๋งํผ๋ง ๋จ๊ธฐ๊ณ ๋ถํ์ํ๊ฑฐ๋ ๊ณผ๋ํ๊ฒ ํ ๋น๋ ๊ณต๊ฐ์ ์ด์์ฒด์ ์ ๋ฐ๋ฉํ๋ ๊ฒ์ Undo tablespace truncate๋ผ๊ณ ํ๋ค.
2๊ฐ์ง ๋ชจ๋๊ฐ ์๋๋ฐ,
- ์๋ ๋ชจ๋: InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํผ์ง ์ค๋ ๋(Purge Thread)๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ๊นจ์ด๋์ ์ธ๋ ๋ก๊ทธ ํ์ผ์์ ์ฌ์ฉ๋์ง ์๋ ๊ณต๊ฐ์ ์๋ผ๋ด๊ณ ์ด์์ฒด์ ๋ก ๋ฐ๋ฉํ๊ฒ ๋๋ค. ์ด๋ฅผ Undo Purge๋ผ๊ณ ํจ.
- innodb_undo_log_truncate: ON(ํ์ฑํ)
- innodb_purge_resg_truncate_frequency: Undo purge ์์ ๋น๋์ ์กฐ์
- ์๋ ๋ชจ๋: ํผ์ง ์ค๋ ๋๋ ๋นํ์ฑ ์ํ์ ์ธ๋ ํ
์ด๋ธ์คํ์ด์ค๋ฅผ ์ฐพ์์ ๋ถํ์ํ ๊ณต๊ฐ์ ์๋ผ๋ด๊ณ ์ด์์ฒด์ ๋ก ๋ฐ๋ฉํ๋ค. ๋ฐ๋ฉ์ด ์๋ฃ๋๋ฉด ์ธ๋ ํ
์ด๋ธ์คํ์ด์ค๋ฅผ ๋ค์ ํ์ฑํ ํ๋ค.
- ์๋ ๋ชจ๋๋ ์ธ๋ ํ ์ด๋ธ์คํ์ด์ค๊ฐ ์ต์ 3๊ฐ ์ด์์ด์ด์ผ ์๋ํ๋ค.
4.2.10 ์ฒด์ธ์ง ๋ฒํผ
Insert, Update ์ ํ ์ด๋ธ์ ํฌํจ๋ ์ธ๋ฑ์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ ์์ ๋ ํ์ํ๋ค. ํ์ง๋ง ์ธ๋ฑ์ค ์ ๋ฐ์ดํธ ์์ ์ ๋๋คํ๊ฒ ๋์คํฌ๋ฅผ ์ฝ๋ ์์ ์ด ํ์ํ๋ฏ๋ก ์ธ๋ฑ์ค๊ฐ ๋ง๋ค๋ฉด ์๋นํ ๋ง์ ์์์ ์๋ชจํ๊ฒ ๋๋ค.
๐ก ๊ทธ๋์ InnoDB๋ ๋ณ๊ฒฝํด์ผ ํ ์ธ๋ฑ์ค ํ์ด์ง๊ฐ ๋ฒํผ ํ์ ์์ผ๋ฉด ๋ฐ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ํํ์ง๋ง, ๊ทธ๋ ์ง ์๊ณ ๋์คํฌ๋ก๋ถํฐ ์ฝ์ด์์ ์ ๋ฐ์ดํธํด์ผ ํ๋ค๋ฉด ์ฆ์ ์คํํ์ง ์๊ณ ์์ ๊ณต๊ฐ์ ์ ์ฅํด ๋๊ณ ์ฌ์ฉ์์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํํ๋ก ์ฑ๋ฅ์ ํฅ์์ํค๊ฒ ๋๋๋ฐ, ์ด๋ ์ฌ์ฉํ๋ ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฒด์ธ์ง ๋ฒํผ๋ผ๊ณ ํ๋ค.
- ์ค๋ณต ์ฌ๋ถ๋ฅผ ์ฒดํฌํด์ผ ํ๋ ์ ๋ํฌ ์ธ๋ฑ์ค๋ ์ฒด์ธ์ง ๋ฒํผ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- innodb_change_buffering : ์ฒด์ธ์ง ๋ฒํผ๊ฐ ๋์ ๋ฐฉ์์ ์ค์ ํ๋ ์์คํ ๋ณ์
- innodb_change_buffer_max_size : ์ฒด์ธ์ง ๋ฒํผ์ ๋ฒํผ ํ ์ฌ์ด์ฆ๋ฅผ ์ค์ ํ๋ ์์คํ ๋ณ์
4.2.11 ๋ฆฌ๋ ๋ก๊ทธ ๋ฐ ๋ก๊ทธ ๋ฒํผ
MySQL์ ํฌํจํ ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ก๊ทธ๋ก ๋จผ์ ๊ธฐ๋กํ๋ค.
2๊ฐ์ง ์ํฉ์ด ์๋ค.
- ์ปค๋ฐ๋์ง๋ง ๋ฐ์ดํฐ ํ์ผ์ ๊ธฐ๋ก๋์ง ์์ ๋ฐ์ดํฐ
- ๋กค๋ฐฑ๋์ง๋ง ๋ฐ์ดํฐ ํ์ผ์ ์ด๋ฏธ ๊ธฐ๋ก๋ ๋ฐ์ดํฐ
1๋ฒ ์ํฉ์, ๋ฆฌ๋ ๋ก๊ทธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ณต์ฌํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
2๋ฒ ์ํฉ์, ๋ฆฌ๋ ๋ก๊ทธ๋ง์ผ๋ก ํด๊ฒฐํ ์๊ฐ ์๋๋ฐ ์ด๋๋ ๋ณ๊ฒฝ๋๊ธฐ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ์ธ๋ ๋ก๊ทธ์ ๋ด์ฉ์ ๊ฐ์ ธ์ ๋ฐ์ดํฐ ํ์ผ์ ๋ณต์ฌํ๋ฉด ๋๋ค. ์ด๋ ๋ฆฌ๋ ๋ก๊ทธ๋ฅผ ์ด์ฉํด ๊ทธ ๋ณ๊ฒฝ์ด ์ปค๋ฐ๋๋์ง, ๋กค๋ฐฑ๋๋์ง, ํธ๋์ญ์ ์ ์คํ ์ค๊ฐ ์ํ์๋์ง ํ์ ํ ์ ์๋ค.
- innodb_flush_log_at_trx_commit : ๋ฆฌ๋ ๋ก๊ทธ๋ฅผ ์ด๋ ์ฃผ๊ธฐ๋ก ๋์คํฌ์ ๋๊ธฐํํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์์คํ ๋ณ์(0,1,2)
4.2.11.2 ๋ฆฌ๋ ๋ก๊ทธ ํ์ฑํ ๋ฐ ๋นํ์ฑํ
MySQL 8.0 ๋ถํฐ๋ ์๋์ผ๋ก ๋ฆฌ๋ ๋ก๊ทธ๋ฅผ ํ์ฑํ ๋๋ ๋นํ์ฑํ ํ ์ ์๋ค.
๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ ์ฌํ๋ ๊ฒฝ์ฐ์๋ ์๋์ผ๋ก ๋ฆฌ๋ ๋ก๊ทธ๋ฅผ ๋นํ์ฑํ ํ์ฌ ๋ฐ์ดํฐ ์ ์ฌ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
mysql> ALTER INSTANCE DISABLE INNODB REDO_LOG;
mysql> LOAD DATA ...
mysql> ALTER INSTANCE ENABLE INNODB REDO_LOG;
4.2.12 ์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค
์ฌ์ฉ์๊ฐ ์์ฃผ ์์ฒญํ๋ ๋ฐ์ดํฐ์ ๋ํด ์๋์ผ๋ก ์์ฑํ๋ ์ธ๋ฑ์ค๋ฅผ ๋ปํ๋ค.
- innodb_adaptive_hash_index: ์์คํ ๋ณ์๋ฅผ ์ด์ฉํด ๊ธฐ๋ฅ์ ํ์ฑํ ๋นํ์ฑํ ํ ์ ์๋ค.
์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค๋ B-Tree ๊ฒ์ ์๊ฐ์ ์ค์ฌ์ฃผ๊ธฐ ์ํด ๋์ ๋ ๊ธฐ๋ฅ์ด๋ค. innoDB ์คํ ๋ฆฌ์ง ์์ง์ ์์ฃผ ์ฝํ๋ ๋ฐ์ดํฐ ํ์ด์ง์ ํค ๊ฐ์ ์ด์ฉํด ํด์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๊ณ , ํ์ํ ๋๋ง๋ค ์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด์ ๋ ์ฝ๋๊ฐ ์ ์ฅ๋ ๋ฐ์ดํฐ ํ์ด์ง๋ฅผ ์ฆ์ ์ฐพ์๊ฐ ์ ์๋ค.
B-Tree ๋ฅผ ๋ฃจํธ ๋ ธ๋๋ถํฐ ๋ฆฌํ ๋ ธ๋๊น์ง ์ฐพ์๊ฐ๋ ๋น์ฉ์ด ์์ด์ง๊ณ , ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ๋นจ๋ผ์ง๊ฒ ๋๋ค.
ํด์ ์ธ๋ฑ์ค๋ ์ธ๋ฑ์ค ํค ๊ฐ๊ณผ ํด๋น ์ธ๋ฑ์ค ํค ๊ฐ์ด ์ ์ฅ๋ ๋ฐ์ดํฐ ํ์ด์ง ์ฃผ์์ ์์ผ๋ก ๊ด๋ฆฌ๋๋๋ฐ, ์ธ๋ฑ์ค ํค ๊ฐ์ B-Tree ์ธ๋ฑ์ค์ ๊ณ ์ ๋ฒํธ(ID)์ B-Tree ์ธ๋ฑ์ค์ ์ค์ ํค ๊ฐ ์กฐํฉ์ผ๋ก ์์ฑ๋๋ค.
์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค
- ์ฑ๋ฅ ํฅ์์ ํฌ๊ฒ ๋์์ด ๋์ง ์๋ ๊ฒฝ์ฐ
- ๋์คํฌ ์ฝ๊ธฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ
- ํน์ ํจํด์ ์ฟผ๋ฆฌ๊ฐ ๋ง์ ๊ฒฝ์ฐ(์กฐ์ธ์ด๋ LIKE ํจํด ๊ฒ์)
- ๋งค์ฐ ํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ํญ๋๊ฒ ์ฝ๋ ๊ฒฝ์ฐ
- ์ฑ๋ฅ ํฅ์์ ํฌ๊ฒ ๋์์ด ๋๋ ๊ฒฝ์ฐ
- ๋์คํฌ์ ๋ฐ์ดํฐ๊ฐ innoDB ๋ฒํผ ํ ํฌ๊ธฐ์ ๋น์ทํ ๊ฒฝ์ฐ(๋์คํฌ ์ฝ์ง๊ฐ ๋ง์ง ์์ ๊ฒฝ์ฐ)
- ๋๋ฑ ์กฐ๊ฑด ๊ฒ์(๋๋ฑ ๋น๊ต์ IN์ฐ์ฐ์)์ด ๋ง์ ๊ฒฝ์ฐ
- ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ดํฐ ์ค์์ ์ผ๋ถ ๋ฐ์ดํฐ์๋ง ์ง์ค๋๋ ๊ฒฝ์ฐ