๐Ÿ“š Databases/RealMySQL 8.0

5.3 InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ž ๊ธˆ

iseunghan 2023. 3. 12. 23:50
๋ฐ˜์‘ํ˜•

5.3 InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ž ๊ธˆ

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ MySQL๊ณผ ๋ณ„๊ฐœ๋กœ ์ž ๊ธˆ์„ ์ œ๊ณตํ•œ๋‹ค.

5.3.1 InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์˜ ์ž ๊ธˆ

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ž ๊ธˆ ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ž ๊ธˆ ์ •๋ณด๊ฐ€ ์ƒ๋‹นํžˆ ์ž‘์€ ๊ณต๊ฐ„์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— *๋ฝ ์—์Šค์ปฌ๋ ˆ์ด์…˜(๋ ˆ์ฝ”๋“œ ๋ฝ์ด ํŽ˜์ด์ง€ ๋ฝ์œผ๋กœ, ๋˜๋Š” ํ…Œ์ด๋ธ” ๋ฝ์œผ๋กœ ๋ ˆ๋ฒจ์—…๋˜๋Š” ๊ฒฝ์šฐ)๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

๋˜ํ•œ InnoDB์—์„œ๋Š” ํŠน์ง•์ธ ๋ ˆ์ฝ”๋“œ์™€ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ทธ๋Š” ๊ฐญ(GAP) ๋ฝ์ด๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ•œ๋‹ค.

Untitled

์ ์„ ์œผ๋กœ ํ‘œ์‹œ๋œ ๊ฒƒ์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋œปํ•œ๋‹ค.

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
      • ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ž˜์น˜(๋ฎคํ…์Šค)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์ง€๋งŒ, ์—ฐ์†๋œ ์ž๋™ ์ฆ๊ฐ€ ๊ฐ’์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

 

๋ฐ˜์‘ํ˜•