5.3 InnoDB ์คํ ๋ฆฌ์ง ์์ง ์ ๊ธ
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ MySQL๊ณผ ๋ณ๊ฐ๋ก ์ ๊ธ์ ์ ๊ณตํ๋ค.
5.3.1 InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ ๊ธ
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๊ธ
์ ์ ๊ณตํ๋ฉฐ, ์ ๊ธ ์ ๋ณด๊ฐ ์๋นํ ์์ ๊ณต๊ฐ์ผ๋ก ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ *๋ฝ ์์ค์ปฌ๋ ์ด์
(๋ ์ฝ๋ ๋ฝ์ด ํ์ด์ง ๋ฝ์ผ๋ก, ๋๋ ํ
์ด๋ธ ๋ฝ์ผ๋ก ๋ ๋ฒจ์
๋๋ ๊ฒฝ์ฐ)๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
๋ํ InnoDB์์๋ ํน์ง์ธ ๋ ์ฝ๋์ ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ ๊ทธ๋ ๊ฐญ(GAP) ๋ฝ
์ด๋ผ๋ ๊ฒ์ด ์กด์ฌํ๋ค.
์ ์ ์ผ๋ก ํ์๋ ๊ฒ์ ์กด์ฌํ์ง ์๋ ๋ ์ฝ๋๋ฅผ ๋ปํ๋ค.
5.3.1.1 ๋ ์ฝ๋ ๋ฝ
๋ ์ฝ๋ ์์ฒด๋ง์ ์ ๊ทธ๋ ๊ฒ์ *๋ ์ฝ๋ ๋ฝ์ด๋ผ๊ณ ํ๋ค.
- ๋ ์ฝ๋ ?
- ๋ ์ฝ๋๋ ํ ์ด๋ธ์ ํ ๋ฐ์ดํฐ์ ์งํฉ(=ํํ, ํ, ๋ ์ฝ๋)๋ฅผ ๋งํ๋ค.
- ์ธ๋ฑ์ค๊ฐ ์๋ ํ ์ด๋ธ์ด๋ผ๋ฉด?
- ๋ด๋ถ์ ์ผ๋ก ์๋ ์์ฑ๋ ์ธ๋ฑ์ค์ ๋ ์ฝ๋๋ฅผ ์ ๊ทผ๋ค.
5.3.1.2 ๊ฐญ ๋ฝ
InnoDB ์คํ ๋ฆฌ์ง ์์ง์๋ง ์๋ ๊ฐญ ๋ฝ์ด๋ผ๋ ๊ฐ๋ ์ด๋ค.
๊ฐญ ๋ฝ์ ๋ ์ฝ๋๋ฅผ ์ ๊ทธ๋๊ฒ ์๋, ๋ ์ฝ๋์ ๋ ์ฝ๋ ์ฌ์ด์ ๊ทธ ๊ฐ๊ฒฉ(๊ฐญ)
์ ์ ๊ทธ๋ ๊ฒ์ด๋ค. ๋ ์ฝ๋์ ๋ ์ฝ๋ ์ฌ์ด์ ์๋ก์ด ๋ ์ฝ๋๊ฐ ์์ฑ๋์ง ์๋๋ก ํ๊ธฐ ์ํจ์ด๋ค.
๊ฐญ ๋ฝ์ ๋ค์์ ์ค๋ช ํ ๋ฅ์คํธ ํค ๋ฝ๊ณผ ํจ๊ป ์ฐ์ธ๋ค.
5.3.1.3 ๋ฅ์คํธ ํค ๋ฝ
๋ ์ฝ๋ ๋ฝ๊ณผ ๊ฐญ ๋ฝ์ ํฉ์ณ ๋์ ํํ์ ์ ๊ธ์ ๋ฅ์คํธ ํค ๋ฝ(Next Key Lock)์ด๋ผ๊ณ ํ๋ค.
- innodb_locks_unsafe_for_binlog ๊ธฐ๋ณธ๊ฐ: ํ์ฑํ
innodb_locks_unsafe_for_binlog
์์คํ ๋ณ์๊ฐ ๋นํ์ฑํ๊ฐ ๋๋ฉด(0์ผ๋ก ์ค์ ) ๋ณ๊ฒฝ์ ์ํด ๊ฒ์ํ๋ ๋ ์ฝ๋์๋ ๋ฅ์คํธ ํค ๋ฝ ๋ฐฉ์์ผ๋ก ์ ๊ธ์ด ๊ฑธ๋ฆฐ๋ค. (๊ณต์๋ฌธ์์๋ Deprecated๋ผ๊ณ ํ์๋๊ณ , 8.0 ๊ธฐ์ค์ผ๋ก๋ ํด๋น ๋ณ์๊ฐ ์ฌ๋ผ์ง)
ํ์ง๋ง, ๋ฅ์คํธ ํค ๋ฝ์ ์ฃผ ๋ชฉ์ ์ ์์ค ์๋ฒ์ ๋ ํ๋ฆฌ์นด ์๋ฒ์ ๋ฐ์ดํฐ ์ผ์น๋ฅผ ์ํด ์ฌ์ฉํ๋ฏ๋ก ๋ ํ๋ฆฌ์นด ์๋ฒ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๊ตณ์ด ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
์๋๋ ์บก๋ฝ, ๋ฅ์คํธ-ํค ๋ฝ
์ ๋ํด์ ์์ธํ๊ฒ ์ค๋ช
ํด์ค๋ค.
[MySQL]MySQL ๋ฒผ๋ฝ์น๊ธฐ(5) - ๊ฐญ๋ฝ(Gap Lock)๊ณผ ๋ฅ์คํธ ํค ๋ฝ(Next-Key Lock)
5.3.1.4 ์๋ ์ฆ๊ฐ ๋ฝ
MySQL์์๋ ์๋ ์ฆ๊ฐํ๋ ์ซ์ ๊ฐ์ ์ถ์ถ(์ฑ๋ฒ)ํ๊ธฐ ์ํด AUTO_INCREMENT
๋ผ๋ ์ปฌ๋ผ ์์ฑ์ ์ ๊ณตํ๋ค. ํด๋น ๊ฐ์ ์ฌ๋ฌ ๋ ์ฝ๋๊ฐ ๋์์ INSERT๊ฐ ๋๋ ๊ฒฝ์ฐ ์ค๋ณต๋์ง ์๊ณ ์์๋๋ก ์ฆ๊ฐํ๋ ์ซ์๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
AUTO_INCREMENT
๋ฝ์ INSERT
์ REPLACE
์ฟผ๋ฆฌ ๋ฌธ์ฅ๊ณผ ๊ฐ์ด ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ ์ฅํ๋ ์ฟผ๋ฆฌ์์๋ง ํ์ํ๋ฉฐ, UPDATE
, DELETE
์ฟผ๋ฆฌ์์๋ ๊ฑธ๋ฆฌ์ง ์๋๋ค.
ํน์ง์ผ๋ก๋, ํธ๋์ญ์
๊ด๊ณ ์์ด INSERT
๋ REPLACE
๋ฌธ์ฅ์์ AUTO_INCREMENT
๊ฐ์ ๊ฐ์ ธ์ค๋ ์๊ฐ์๋ง ๋ฝ์ด ๊ฑธ๋ ธ๋ค๊ฐ ์ฆ์ ํด์ ๋๋ค. (AUTO_INCREMENT
์ ๋ช
์์ ์ผ๋ก ๊ฐ์ ์ง์ ํด๋ ์๋ ์ฆ๊ฐ ๋ฝ์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ค)
- ์์ฃผ ์งง์ ์๊ฐ์๋ง ๋ฝ์ด ๊ฑธ๋ ธ๋ค๊ฐ ํด์ ๋๋ ์ ๊ธ์ด๋ผ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง ์๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ ์ ์๋ค.
- innodb_autoinc_lock_mode=0
- ๋ชจ๋ INSERT ๋ฌธ์ฅ์ ์๋ ์ฆ๊ฐ ๋ฝ์ ์ฌ์ฉํ๋ค.
- innodb_autoinc_lock_mode=1
- ๋จ์ํ 1๊ฑด ๋๋ ์ฌ๋ฌ๊ฑด์ ๋ ์ฝ๋๋ฅผ MySQL ์๋ฒ๊ฐ ๋ ์ฝ๋์ ๊ฑด์๋ฅผ ์ ํํ๊ฒ ์์ธกํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์๋ ์ฆ๊ฐ ๋ฝ์ ์ฌ์ฉํ์ง ์๊ณ ๋์น(๋ฎคํ ์ค)๋ฅผ ์ด์ฉํด ์ฒ๋ฆฌํ๋ค. (์ดํ ์๋ต…)
- innodb_autoinc_lock_mode=2
- ์๋ ์ฆ๊ฐ ๋ฝ์ ์ฌ์ฉํ์ง ์๊ณ , ๋์น(๋ฎคํ ์ค)๋ฅผ ์ฌ์ฉํ๋ค. ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ํฅ์๋์ง๋ง, ์ฐ์๋ ์๋ ์ฆ๊ฐ ๊ฐ์ ๋ณด์ฅํ์ง ์๋๋ค.
- innodb_autoinc_lock_mode=0
5.3.2 ์ธ๋ฑ์ค์ ์ ๊ธ
์์ innoDB๋ ๋ ์ฝ๋๋ฅผ ์์ฒด๋ฅผ ์ ๊ทธ๋ ๊ฒ์ด ์๋ ์ธ๋ฑ์ค๋ฅผ ์ ๊ทธ๋ ๋ฐฉ์์ด๋ผ๊ณ ํ๋ค.
์ฆ, ๋ณ๊ฒฝํด์ผ ํ ๋ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ ์ํด ๊ฒ์ํ ์ธ๋ฑ์ค์ ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ๋ฝ์ ๊ฑธ์ด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด UPDATE ๋ฌธ
์ ์ดํด๋ณด์.
- emp ํ ์ด๋ธ์๋ first_name ์ปฌ๋ผ์๋ง ์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ ค์๋ค.
mysql> SELECT COUNT(*) FROM emp WHERE first_name='Georgi';
+------+
| 253 |
+------+
mysql> SELECT COUNT(*) FROM emp WHERE first_name='Georgi' and last_name='Klassen';
+------+
| 1 |
+------+
mysql> UPDATE emp SET hire_date=NOW() WHERE first_name='Georgi' and last_name='Klassen';
--- 1๊ฑด์ ๋ ์ฝ๋ ์
๋ฐ์ดํธ
๊ณผ์ฐ ๋จ 1๊ฑด
์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํ UPDATE ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋ ๋ฝ
์ด ๊ฑธ๋ฆฌ๋ ๋ ์ฝ๋๋ ๋ช๊ฐ์ผ๊น?
๋ฐ๋ก 253๊ฐ์ ๋ ์ฝ๋์ด๋ค.
- ๋ง์ฝ ์ธ๋ฑ์ค๊ฐ ํ๋๋ ์์๋ค๋ฉด?์ด๊ฒ์ด ๋ฐ๋ก MySQL ๋ง์ ๋ฐฉ์์ด๋ฉฐ InnoDB์์ ์ธ๋ฑ์ค ์ค๊ณ๊ฐ ์ค์ํ ์ด์ ์ด๋ค.
- where์ ์ ์์ฃผ ๋ค์ด๊ฐ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ๋ ์์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ค. (where์ ์ ๋ ์ปฌ๋ผ์ด ์ฐ์ด๋๋ฐ ํ๋๋ง ๊ฑธ๋ฉด ์๋ฏธ ์๋ค)
- ํ ์ด๋ธ ํ ์ค์บํ๋ฉด์ ๋ช์ฒ..๋ช์ต๊ฐ์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ ๊ทธ๊ฒ ๋๋ค.
5.3.3 ๋ ์ฝ๋ ์์ค์ ์ ๊ธ ํ์ธ ๋ฐ ํด์
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๋ ์ฝ๋ ์์ค ์ ๊ธ์ ํ ์ด๋ธ ์์ค ์ ๊ธ๋ณด๋ค๋ ์กฐ๊ธ ๋ ๋ณต์กํ๋ค. ํ ์ด๋ธ ์ ๊ธ์ ๋์ ํ ์ด๋ธ์ด ์ ๊ฒผ๋์ง ์ฝ๊ฒ ํ์ ์ด ๋์ง๋ง, ๋ ์ฝ๋ ์ ๊ธ์ ์ ์์ฐ์ด๋ ๋ ์ฝ๋๊ฐ ์ ๊ธฐ๋ฉด ํ์ฐธ๋์์ด๋ ์ ๊ฒจ์๋ ์ํ๋ก ๋จ์์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. (๊ฐ์ ๋ก ์ข ๋ฃํ๋ ค๋ฉด KILL ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์)
๋ค์ ์๋๋ฆฌ์ค๋ฅผ ๋ณด๋ฉด์ ์ ๊ธ์ ๋ํด์ ์ดํดํด๋ณด์.
connection 1:
BEGIN;
UPDATE emp SET hire_date=NOW() WHERE emp_no=100;
connection 2:
UPDATE emp SET hire_date=NOW() WHERE emp_no=100;
connection 3:
UPDATE emp SET hire_date=NOW() WHERE emp_no=100;
MySQL 8.0๋ถํฐ๋ performance_schema
์ data_locks
์ data_lock_waits
ํ
์ด๋ธ์ ์ด์ฉํด ํธ๋์ญ์
์ด ์ด๋ค ์ ๊ธ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋์ง, ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ ๊ธ์ ์ด๋ค ํธ๋์ญ์
์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ ์ ์๋ค.
mysql> SHOW PROCESSLIST;
id | time | state | info |
17 | 607 | NULL | |
18 | 22 | updating | UPDATE emp SET hire_date=NOW() WHERE emp_no=100 |
19 | 21 | updating | UPDATE emp SET hire_date=NOW() WHERE emp_no=100 |