DB/MySQL

[MySQL] MySQL ๋ฝ

YeopJu 2024. 4. 6. 20:22
๋ฐ˜์‘ํ˜•

DB์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๋˜ ์ค‘, ๋ฌธ๋“ ์ด๋•Œ๊นŒ์ง€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋‹จ ํ•œ๋ฒˆ๋„ DB์—์„œ ์ผ์–ด๋‚˜๋Š” ๋™์‹œ์„ฑ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ณ ๋ คํ•ด๋ณธ์ ์ด ์—†๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” DB ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ด๋ฉฐ ๋จผ์ € ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ž์ฃผ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ธ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€๊ณผ MySQL ๋ฝ์— ๊ด€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

์ด ๊ธ€์€ ๋Œ€๋ถ€๋ถ„ ์ €์˜ ๊ธฐ์–ต์„ ์ƒ๊ธฐํ•˜์—ฌ ์งง๊ฒŒ ์“ด ๊ธ€์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์›ํ•˜์‹ ๋‹ค๋ฉด MySQL ๋„ํ๋จผํŠธ๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

 

 


 

 

MySQL์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฝ์€ ํฌ๊ฒŒ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ๊ณผ MySQL ์—”์ง„ ๋ ˆ๋ฒจ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ์˜ ์ž ๊ธˆ์€ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ฝ์ด๋ฉฐ, MySQL ์—”์ง„ ๋ ˆ๋ฒจ์˜ ์ž ๊ธˆ์€ ํ…Œ์ด๋ธ”์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์„ ์œ„ํ•œ ๋ฝ์— ํ•ด๋‹นํ•œ๋‹ค.

 

 

โ˜‘๏ธ InnoDB ์—”์ง„ ๋ฝ

 

๐Ÿ’  S-lock (Shared-Lock)๊ณผ X-lock (Exclusive-Lock)

S-lock์€ ์ฝ๊ธฐ๋ฝ, ๊ณต์œ ๋ฝ์ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ ๋Œ€์ƒ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ๋Š” ๊ฒƒ์€ ํ—ˆ์šฉํ•˜์ง€๋งŒ DML ์ž‘์—…์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๋‹ค๋ฅธ S-lock์ด ๊ฑธ๋ฆฐ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ˆ˜์ •์„ ํ•œ๋‹ค๋ฉด ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

X-lock์€ ์“ฐ๊ธฐ๋ฝ, ๋ฒ ํƒ€๋ฝ์ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ X-lock, S-lock ๋ชจ๋‘ ๊ฑธ ์ˆ˜ ์—†๋‹ค. ์ด ๋•Œ ์œ ์˜ํ•ด์•ผํ•  ์ ์€ Select For Update, Update, Delete๋ฅผ ๋ชปํ•˜๋Š” ๊ฒƒ์ด์ง€ ์ˆœ์ˆ˜ํ•œ Select๋ฅผ ๋ชปํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๐Ÿ’  ๋ ˆ์ฝ”๋“œ๋ฝ

ํŠธ๋žœ์žญ์…˜์ด DML๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ๋Œ€์ƒ ๋ ˆ์ฝ”๋“œ์— ๊ฑฐ๋Š” ๋ฝ์œผ๋กœ InnoDB ์—”์ง„์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๋ ˆ์ฝ”๋“œ์˜ ์ธ๋ฑ์Šค์— ๋ฝ์„ ๊ฑด๋‹ค.

์ด ๋•Œ ์ธ๋ฑ์Šค์— ๋ฝ์„ ๊ฑฐ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

'O' ์„ฑ์„ ๊ฐ€์ง„ Member๋Š” 100๋ช…์ด๊ณ  ์ด๋ฆ„์ด 'Juyeop'์ธ ์‚ฌ๋žŒ์€ 1๋ช…์ด๋ฉฐ ์ธ๋ฑ์Šค๋Š” last_name์—ํ•ด์„œ๋งŒ ๊ฑธ๋ ค ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด 100๊ฐœ์˜ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ์— ๋ฝ์„ ๊ฑธ์–ด์•ผ๋งŒ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋–„๋ฌธ์— ์ธ๋ฑ์Šค๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์€ ๋™์‹œ์„ฑ์— ํฐ ์˜ํ–ฅ์„ ์ค€๋‹ค.

UPDATE member SET age = 26 WHERE last_name LIKE 'O%' AND first_name = 'Juyeop';

 

 

๐Ÿ’  ๊ฐญ ๋ฝ

MySQL๊ณผ ๋‹ค๋ฅธ RDBMS์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด๋ฉฐ ๋ ˆ์ฝ”๋“œ์™€ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ทธ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์˜ ์ง€์ •๋œ ๋ฒ”์œ„๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ž ๊ธˆ์ด๋‹ค. ์ด๋Š” ๋Œ€์ฒด๋กœ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ๋ ˆ์ฝ”๋“œ๋ฝ๊ณผ ํ•จ๊ป˜ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๋˜ํ•œ ํŒฌํ…€๋ฆฌ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ค‘ ํ•˜๋‚˜์ธ ์กฐํšŒ ์‚ฌ์ด์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ์˜ DML ์ž‘์—…์ด ์žˆ์„ ๋•Œ, ์ผ๊ด€๋œ ์ฝ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด์ค€๋‹ค.

 

 

๐Ÿ’  ๋„ฅ์ŠคํŠธํ‚ค ๋ฝ

๋ ˆ์ฝ”๋“œ ๋ฝ๊ณผ ๊ฐญ๋ฝ์„ ํ•ฉ์นœ ์ž ๊ธˆ์ด๋‹ค.

๊ฐญ ๋ฝ์ด๋‚˜ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ๊ธฐ๋ก๋˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋ฆฌํ”Œ๋ฆฌ์นด ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ๋•Œ ์†Œ์Šค ์„œ๋ฒ„์—์„œ ๋งŒ๋“ค์–ด๋‚ธ ๊ฒฐ๊ณผ์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋„๋ก ๋ณด์žฅํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ฃผ๋ชฉ์ ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์˜์™ธ๋กœ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ๊ณผ ๊ฐญ ๋ฝ์œผ๋กœ ์ธํ•ด ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ผ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ํฌ๋งท์„ ROW ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์„œ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์ด๋‚˜ ๊ฐญ ๋ฝ์„ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.

 

 

๐Ÿ’  ์ž๋™ ์ฆ๊ฐ€ ๋ฝ

MySQL์€ ์ž๋™ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆซ์ž๊ฐ’์„ ์œ„ํ•ด AUTO_INCREMENT๋ผ๋Š” ์ปฌ๋Ÿผ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋Š” ์ฃผ๋กœ ๋Œ€์ฒดํ‚ค์— ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋•Œ  AUTO_INCREMENT ์ปฌ๋Ÿผ์€ ์—ฌ๋Ÿฌ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋™์‹œ์— INSERT ๋˜๋”๋ผ๋„ ์ค‘๋ณต๋˜์ง€ ์•Š๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ผ๋ จ๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ํ…Œ์ด๋ธ” ์ˆ˜์ค€์˜ ์ž ๊ธˆ์ธ ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ•ด๋‹น ๋ฝ์€ ํŠธ๋žœ์žญ์…˜๊ณผ ๊ด€๊ณ„์—†์ด INSERT๋‚˜ REPLACE ๋ฌธ์žฅ์—์„œ AUTO_INCREMENT ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์ˆœ๊ฐ„์— ๋ฝ์ด ๊ฑธ๋ฆฐ๋‹ค. ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์€ ํ…Œ์ด๋ธ”์— 1๊ฐœ๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ์ฟผ๋ฆฌ์—์„œ ๋ฝ์„ ํš๋“ํ•˜์—ฌ ์ฑ„๋ฒˆ์ค‘์ด๋ผ๋ฉด ๋‹ค์Œ ์ฟผ๋ฆฌ๋Š” ๋ฝ์„ ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์•„์ฃผ ์งง์€ ์ˆœ๊ฐ„๋งŒ ๊ฑธ๋ ธ๋‹ค๊ฐ€ ์ฆ‰์‹œ ํ•ด์ œ๋˜๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.์ž๋™ ์ฆ๊ฐ€ ๋ฝ์€ ์ž ๊ธˆ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ ์ฆ๊ฐ€ํ•˜๋ฉด ์ ˆ๋Œ€ ์ž๋™์œผ๋กœ ์ค„์–ด๋“ค์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ž์„œ ์„ค๋ช…ํ•˜์˜€๋“ฏ ์ด๋Š” ํŠธ๋žœ์žญ์…˜๊ณผ๋„ ๋ฌด๊ด€ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋™ ์ฆ๊ฐ€๊ฐ’ ์ฑ„๋ฒˆ์— ์„ฑ๊ณตํ•˜์˜€์ง€๋งŒ, ์ดํ›„์˜ ์ฟผ๋ฆฌ์—์„œ ์‹คํŒจํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜์–ด๋„ ์ž๋™ ์ฆ๊ฐ€๊ฐ’์€ ๋ณต๊ตฌ๋˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‚จ๋Š”๋‹ค.

 

 

โ˜‘๏ธ MySQL์—”์ง„ ๋ฝ

๐Ÿ’ ํ…Œ์ด๋ธ” ๋ฝ

ํ…Œ์ด๋ธ” ๋ฝ์€ ๊ฐœ๋ณ„ ํ…Œ์ด๋ธ” ๋‹จ์œ„๋กœ ์„ค์ •๋˜๋Š” ์ž ๊ธˆ์ด๋ฉฐ, ๋ช…์‹œ์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ ํŠน์ • ํ…Œ์ด๋ธ”์˜ ๋ฝ์„ ํš๋“ํ•˜๊ณ  ๋ฐ˜๋‚ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

LOCK TABLES table_name [ READ ๋˜๋Š” WRITE]
UNLOCK TABLES

 

๐Ÿ’ ๋„ค์ž„๋“œ ๋ฝ

ํ…Œ์ด๋ธ”์ด๋‚˜ ๋ ˆ์ฝ”๋“œ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด์— ๊ฑฐ๋Š” ๋ฝ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์ž„์˜์˜ ๋ฌธ์ž์—ด ๊ฑฐ๋Š” ๋ฝ์ด๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ WAS ์„œ๋ฒ„์—์„œ ํ•˜๋‚˜์˜ DB ์„œ๋ฒ„์— ์ ‘๊ทผํ•  ๋•Œ ์ƒํ˜ธ ๋™๊ธฐํ™”ํ•˜๋Š”๋ฐ์— ์ฃผ๋กœ ์“ฐ์ธ๋‹ค.

 

๐Ÿ’  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด์˜ ์ด๋ฆ„์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝ ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์–ป์–ด์ง€๋Š” ๋ฝ์ด๋‹ค. ์ด๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์–ป์„ ์ˆ˜ ์—†๊ณ  ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์ž๋™์ ์œผ๋กœ ์–ป์–ด์ง€๋Š” ๋ฝ์ด๋‹ค.

 

 

 

 

โ˜‘๏ธ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

๐Ÿ’  SERIALIZABLE

SELECT์—๋„ ๋Œ€์ƒ ๋ ˆ์ฝ”๋“œ์— ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์„ ๊ณต์œ  ๋ฝ์œผ๋กœ ๊ฑธ์–ด ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค. ๋™์‹œ์„ฑ์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

 

๐Ÿ’  REPEATABLE READ

๋ณ€๊ฒฝ๋œ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์–ธ๋‘ ์˜์—ญ์— ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋žœ์žญ์…˜ ๋„˜๋ฒ„์™€ ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ผ๊ด€๋œ ์ฝ๊ธฐ(Non-Lockong Read)๋ฅผ ์ง€์›ํ•˜๋ฉฐ  ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ ์‹œ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ๋˜ํ•œ InnoDB์—์„œ๋Š” ๊ฐญ๋ฝ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— SELECT<User A> → INSERT<User B>  → SELECT FOR UPDATE<User A>๋ฅผ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํŒฌํ…€ ๋ฆฌ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

๐Ÿ’  READ COMMITED

์ปค๋ฐ‹๋œ ๋ ˆ์ฝ”๋“œ๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ ํŒฌํ…€ ๋ฆฌ๋“œ์™€ ๋”๋ถˆ์–ด Non-Repeatable Read ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

๐Ÿ’  READ UNCOMMITED

์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ ˆ์ฝ”๋“œ๋„ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ํŒฌํ…€๋ฆฌ๋“œ, Non-Repeatable Read ๊ทธ๋ฆฌ๊ณ  Dirty-Read ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. Dirty-Read๋Š” ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝํžˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•