JiwonDev

์ •๋ฆฌ์ค‘ -2

by JiwonDev

MySQL ์€ MySQL ์—”์ง„๊ณผ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค.

2021.10.13 - [๐ŸŒฑBackend/DB(MySQL)] - ์ •๋ฆฌ์ค‘ #1 ์—”์ง„ ์•„ํ‚คํ…์ฒ˜

 

์ •๋ฆฌ์ค‘ #1 ์—”์ง„ ์•„ํ‚คํ…์ฒ˜

๐Ÿ“Œ MySQL ์—”์ง„ ์•„ํ‚คํ…์ฒ˜ MySQL Server๋Š” ๋‹ค๋ฅธ DB์— ๋น„ํ•ด ๊ตฌ์กฐ๊ฐ€ ๋…ํŠนํ•œ ํŽธ์ด๋‹ค. ์ด๋กœ ์ธํ•ด ์ถ”๊ฐ€์ ์ธ ํ˜œํƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ๋‹ค๋ฅธ DB์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. MySQL์€ ํฌ

jiwondev.tistory.com

 

๐Ÿ“Œ MySQL์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€

MySQL ์—”์ง„์€ ํด๋ผ์ด์–ธํŠธ๋กœ ์˜ค๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ, SQL๋ฌธ์žฅ์„ ๋ถ„์„ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅ, ์กฐํšŒํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

MySQL ์„œ๋ฒ„์— [MySQL ์—”์ง„]์€ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์Šคํ† ๋ฆฌ์ง€๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

  • MySQL ์—”์ง„
    โœ” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , SQL๋ฌธ์„ [์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์˜ Handler Api ์š”์ฒญ]์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• 
    โœ” Connetion Handler : ์ปค๋„ฅ์…˜ ๋ฐ ์ฟผ๋ฆฌ ์š”์ฒญ์„ ๋‹ด๋‹น
    โœ” SQL Interface : DML, DDL, Procedure, View ๋“ฑ SQL ๋ฌธ๋ฒ• ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
    โœ” SQL Parser :  SQL ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ํƒ์ง€, ํ† ํฐ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ  ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜.
    โœ” SQL Optimize : ์ฟผ๋ฆฌ์˜ ์ตœ์ ํ™”๋œ ์‹คํ–‰ ๋‹ด๋‹น. ์‹คํ–‰ ๊ณ„ํš์„ ๋งŒ๋“ฆ
    โœ” Cache & Buffer
    โœ” Query execution engine (api calls) : ๋งŒ๋“ค์–ด์ง„ ์‹คํ–‰ ๊ณ„ํš์„ Storage ์—”์ง„์— ์š”์ฒญ, ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ํด๋ผ์ด์–ธํŠธ ๋ฐ˜ํ™˜.
์˜ˆ๋ฅผ ๋“ค์–ด GROUP BY ๋ผ๋Š” ์‹คํ–‰๊ณ„ํš์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์ด ์ง„ํ–‰๋œ๋‹ค.
1. ์‹คํ–‰ ์—”์ง„์ด Handler API๋กœ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๋ผ๊ณ  ์š”์ฒญ
2. ์‹คํ–‰ ์—”์ง„์€ WHERE ์ ˆ์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์˜ค๋ผ๊ณ  Handler API ์š”์ฒญ
3. ์ฝ์–ด์˜จ ๋ ˆ์ฝ”๋“œ๋“ค์„ ์ž„์‹œํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๋ผ๊ณ  Handler API ์š”์ฒญ
4. ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋œ ์ž„์‹œ ํ…Œ์ด๋ธ”์—์„œ ํ•„์š”ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋ผ๊ณ  Handler API ์š”์ฒญ
5. ์ตœ์ข…์ ์œผ๋กœ ์‹คํ–‰ ์—”์ง„์€ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž๋‚˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ๋„˜๊น€

 

  • Storage ์—”์ง„
    โœ” ์‹ค์งˆ์ ์œผ๋กœ ๋””์Šคํฌ๋ฅผ ์ฝ๊ณ , ์“ฐ๋Š” ์—ญํ• 
    โœ” Handler Api ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด MySQL ์—”์ง„์ด ๋””์Šคํฌ ์ฝ๊ธฐ, ์“ฐ๊ธฐ๋ฅผ ์š”์ฒญํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›์Œ.
    โœ” ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•ํƒœ๋กœ MySQL ์—”์ง„๊ณผ ์˜์กด์„ฑ์ด ์—†์œผ๋ฉฐ ์ฟผ๋ฆฌ๋ณ„๋กœ ๋‹ค๋ฅธ Storage Engine์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

 


๐Ÿ“ŒMySQL ์ฟผ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”๊ฐ€

  • MySQL ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ(SQL๋ฌธ)์„ ๋ฐ›์Œ.
  • ํŒŒ์„œ(Parser) ๊ฐ€ SQL๋ฌธ์ด ์œ ํšจํ•œ์ง€ ํ† ํฐ ๋‹จ์œ„๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ํŒŒ์„œ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ์ „์ฒ˜๋ฆฌ๊ธฐ(Pre-Processor)๊ฐ€ ํŒŒ์„œ ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•จ. ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”, ๊ถŒํ•œ๋“ฑ์„ ์—ฌ๊ธฐ์„œ ๊ตฌ๋ณ„ 
    ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๋œ [์œ ํšจํ•œ SQL ์ฟผ๋ฆฌ๋ฌธ์˜ ํŠธ๋ฆฌ]๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, Optimizer๋กœ ๋„˜๊น€.
  • ์˜ตํ‹ฐ๋งˆ์ด์ €(Optimizer)๋Š” ์š”์ฒญ๋ฐ›์€ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”์‹œ์ผœ ์‹ค์ œ ์‹คํ–‰๊ณ„ํš์„ ๋งŒ๋“ ๋‹ค.
    ๊ฐœ๋ฐœ์ž๋Š” EXPLAIN ๋ฌธ์œผ๋กœ MySQL Optimizer๊ฐ€ ์ƒ์„ฑํ•ด๋‚ธ ์‹คํ–‰๊ณ„ํš์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๋งŒ๋“ค์–ด์ง„ ์‹คํ–‰ ๊ณ„ํš์„ ๋ถ„์„ํ•˜์—ฌ MySQL Optimizer๊ฐ€ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • ์‹คํ–‰ ์—”์ง„(Execution Engine)์€ ๋งŒ๋“ค์–ด์ง„ ์‹คํ–‰ ๊ณ„ํš๋Œ€๋กœ Handler API๋ฅผ ํ†ตํ•ด ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์กฐ์ž‘ํ•œ๋‹ค.
    Storage Engine์€ ์‹คํ–‰ ์—”์ง„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Handler API๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค. ๊ทธ ์™ธ์˜ ์˜์กด์„ฑ์€ ์—†๋‹ค.

์ฟผ๋ฆฌ๋ฅผ ๊ผญ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ตœ์ ํ™” ํ•ด์•ผํ•˜๋‚˜์š”? ๊ฐ„๋‹จํ•œ๊ฑด ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜์š”?

๋”๋ณด๊ธฐ

์–ด๋–ค ํšŒ์‚ฌ๋ฅผ ๊ฐ€๋˜, ์–ด๋–ค ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋˜ ์ฟผ๋ฆฌ์—๋Š” ์ •๋‹ต์ด ์—†๋‹ค. ๋˜ํ•œ Optimizer๋Š” ๋งŒ๋Šฅ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

/*
[์ง์›์ •๋ณด ํ…Œ์ด๋ธ” A, ๋ถ€์„œ์ •๋ณด ํ…Œ์ด๋ธ” B]
๊ฐ ๋ถ€์„œ๋ณ„๋กœ 2000๋…„ ์ดํ›„ ์ž…์‚ฌํ•œ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•ด์„œ
GROUP BY๋กœ ์ž…์‚ฌํ•œ ์—ฐ๋„๋ณ„ ์‚ฌ์›์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ
*/
SELECT
    B.๋ถ€์„œ๋ช…
    , COUNT(*) AS ์‚ฌ์›์ˆ˜
    , SUBSTR(TO_CHAR(A.์ž…์‚ฌ์ผ,'yyyymmdd'),1,4) AS ์ž…์‚ฌ๋…„๋„
FROM
    ์ง์›์ •๋ณด A
    , ๋ถ€์„œ์ •๋ณด B ON B.๋ถ€์„œID = A.๋ถ€์„œID
WHERE
    TO_CHAR(A.์ž…์‚ฌ์ผ,'yyyy') >= '2000'
GROUP BY
    B.๋ถ€์„œ๋ช…
    , SUBSTR(TO_CHAR(A.์ž…์‚ฌ์ผ, 'yyyymmdd'),1,4)

 

ํ•ด๋‹น SQL๋ฌธ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์กฐ์น˜๋ฅผ ์ทจํ•˜๋ฉด Optimizer๊ฐ€ ์ตœ์ ํ™” ํ•  ์—ฌ์ง€๋ฅผ ์ค€๋‹ค.

  • ์นผ๋Ÿผ์„ ๊ฐ€๊ณตํ•˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์•ˆํƒ„๋‹ค.
    [ TO_CHAR(์ž…์‚ฌ์ผ) >= '2000' ] โžก [ ์ž…์‚ฌ์ผ >= TO_DATA(yyyymmdd) ]๋กœ ์นผ๋Ÿผ์„ ๊ฐ€๊ณตํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ ๋‹ค.
    ์ธ๋ฑ์Šค ์ƒ์„ฑ์‹œ Column ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Column์— ์†์„ ๋Œ€๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์กฐํšŒํ•œ๋‹ค.

  • ๋จผ์ € ๋ฒ”์œ„๋ฅผ ์ค„์ด๊ณ  ์กฐ๊ฑด์„ ๊ฑธ๋ฉด ์ฒ˜๋ฆฌํ•  ๋ฐ์ดํ„ฐ๋Ÿ‰์ด ์ ์–ด์ง„๋‹ค.
    [ ๋ถ€์„œID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋จผ์ € GROUP BY ] ์ดํ›„ [ WHERE ์กฐ๊ฑด ] ์„ ๋„ฃ์œผ๋ฉด ์ง์›๊ณผ ๋ถ€์„œ ํ…Œ์ด๋ธ”์ด 1:1 ๊ด€๊ณ„๊ฐ€ ๋œ๋‹ค.

  • ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์ค„์ด์ž
    SUBSTR(TO_CHAR(...)) ๋Š” TO_DATE(...) ํ•˜๋‚˜๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅํ•˜๋‹ค.
SELECT
    B.๋ถ€์„œ๋ช…
    , A.์‚ฌ์›์ˆ˜
    , A.์ž…์‚ฌ๋…„๋„
FROM
    (SELECT -- ๋ฒ”์œ„๋ฅผ ์ค„์˜€๋‹ค. ์ง์›์ •๋ณด A ํ…Œ์ด๋ธ”์„ GROUP BY๋กœ ๋จผ์ € ๋ฝ‘์•„๋ƒ„
        ๋ถ€์„œID
        , TO_CHAR(a.์ž…์‚ฌ์ผ, 'yyyy') AS ์ž…์‚ฌ๋…„๋„
        , COUNT(*) AS ์‚ฌ์›์ˆ˜
     FROM
        ์ง์›์ •๋ณด
     WHERE
        ์ž…์‚ฌ์ผ >= TO_DATE('20000101','yyyymmdd')
     GROUP BY
        ๋ถ€์„œID
        , TO_CHAR(a.์ž…์‚ฌ์ผ, 'yyyy')
    ) A
    , ๋ถ€์„œ์ •๋ณด B ON B.๋ถ€์„œID = a.๋ถ€์„œid

 

 


๐Ÿ“Œ MySQL ์Šค๋ ˆ๋“œ ๊ตฌ์กฐ

๊ธฐ์กด์˜ MyISBM ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ forground thread์—์„œ ๋””์Šคํฌ๋ฅผ ์ฝ๊ณ , ์“ฐ๋Š” ๊ฑธ ๋‹ค ๋‹ด๋‹นํ–ˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ InnoDB ์—”์ง„์€ ์—ญํ• ์ด ํ™•์‹คํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด, ๋Œ€๋ถ€๋ถ„์˜ ์ฒ˜๋ฆฌ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.

(๋งŒ์•ฝ ์บ์‹œ&๋ฒ„ํผ์— ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋””์Šคํฌ์—์„œ ์ฝ์–ด๋“ค์ด๋ฉฐ, ์“ฐ๊ธฐ๋Š” ์˜ˆ์™ธ ์—†์ด ๋ฌด์กฐ๊ฑด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๊ฐ€ ๋‹ด๋‹นํ•จ.)

foreground๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ฒ˜๋ฆฌ, ์ฝ๊ธฐ๋งŒ ๋‹ด๋‹นํ•œ๋‹ค. ๋ฒ„ํผ์— ์“ฐ๋Š” ๊ฒƒ๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์˜ ๋ชซ (InnoDB ๊ธฐ์ค€)

  • foreground thread
    โœ” ํด๋ผ์ด์–ธํŠธ๋‹น ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋จ.
    โœ” ๊ณ ๊ฐ ์ฐฝ๊ตฌ ์—ญํ• , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ์ฟผ๋ฆฌ ๋ฌธ์žฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ
    โœ” ๋ฐ์ดํ„ฐ ์กฐํšŒ ์Šค๋ ˆ๋“œ (๋ฒ„ํผ๋‚˜ ์บ์‹œ์—์„œ ๊ฐ€์ ธ์˜ค๊ณ , ์—†๋‹ค๋ฉด ์ธ๋ฑ์Šค๋‚˜ ๋””์Šคํฌ์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด)
    โœ” ๋‹ค๋งŒ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฌดํ•œ์ • ์ƒ์„ฑํ•˜๋Š”๊ฑด ์•„๋‹ˆ๊ณ , ์„ค์ •๊ฐ’(thread_cache_size)์„ ์ดˆ๊ณผํ–ˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ ๋ฐ˜๋‚ฉ์„ ๊ธฐ๋‹ค๋ฆผ.
    ์“ฐ๋ ˆ๋“œ๋Š” ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋œ๋‹ค. ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜๋ฅผ ๋ณด๊ณ  ํ”ผํฌ ์น˜๋ณด๋‹ค ์•ฝ๊ฐ„ ๋‚ฎ์€ size๋กœ ํ• ๋‹นํ•˜์ž.
    - ํ•„์š” ์ด์ƒ์˜ ๋งŽ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‚ฌ๋ผ์ง€๋ฉด ์„œ๋ฒ„ ์„ฑ๋Šฅ์— ๋งŽ์€ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.
    - ๋ฐ˜๋Œ€๋กœ ์Šค๋ ˆ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋ถ€์กฑํ•˜๋‹ค๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ ๋ฐ˜๋‚ฉ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ์š”์ฒญ์ด ๋”œ๋ ˆ์ด ๋œ๋‹ค. 

  • background thread
    โœ” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋™์ž‘์— ํ•„์š”ํ•œ ์Šค๋ ˆ๋“œ๋“ค. ์Šค๋ ˆ๋“œ ๋ณ„๋กœ ์—ญํ• ์ด ๋‚˜๋ˆ„์–ด์ ธ์žˆ์Œ.
    โœ” Insert buffer๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ์Šค๋ ˆ๋“œ
    โœ” ๋กœ๊ทธ ๊ธฐ๋ก์„ ๋‹ด๋‹นํ•˜๋Š” ์Šค๋ ˆ๋“œ
    โœ” InnoDB ๋ฒ„ํผ ํ’€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ๋กœ ๊ธฐ๋ก(Write)ํ•˜๋Š” ์Šค๋ ˆ๋“œ
    โœ” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ๋กœ ๊ฐ€์ ธ์˜ค๋Š”(Read) ์Šค๋ ˆ๋“œ
    โœ” ์ž ๊ธˆ, ๋ฐ๋“œ๋ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋Š” ์Šค๋ ˆ๋“œ
    โœ” ๋ชจ๋“  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ

 


๐Ÿ“Œ MySQL ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

MySQL์€ Static๊ณผ Local์ฒ˜๋Ÿผ, ๊ธ€๋กœ๋ฒŒ ๋ฉ”๋ชจ๋ฆฌ์™€ ์„ธ์…˜ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋‚˜๋ˆ„์–ด์ง.

  • Global Memory
    โœ” MySQL ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์šด์˜์ฒด์ œ๋กœ ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์Œ. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•จ
    * ๋‹ค๋งŒ ์ž๋ฐ” static ์˜์—ญ์ฒ˜๋Ÿผ ๋ฌด์กฐ๊ฑด ์ฒ˜์Œ๋ถ€ํ„ฐ 100% ํ• ๋‹น๋˜๋Š”๊ฑด ์•„๋‹ˆ๊ณ , ์šด์˜์ฒด์ œ์˜ ํ• ๋‹น ๋ฐฉ์‹์— ๋”ฐ๋ผ ์˜ˆ์•ฝํ•ด๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ ์กฐ๊ธˆ์”ฉ ํ• ๋‹นํ•ด์ฃผ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

  • Session Memory (Local Memory, Connection Memory ๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ)
    โœ” ํด๋ผ์ด์–ธํŠธ ์Šค๋ ˆ๋“œ(foreground thread)๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ.
    โœ” ๋‹น์—ฐํžˆ ์Šค๋ ˆ๋“œ ๋ณ„๋กœ ๋…๋ฆฝ์ ์ด๋ฉฐ ๊ณต์œ ๋˜์ง€ ์•Š์Œ.
    โœ” ๊ธ€๋กœ๋ฒŒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ํ•„์š”์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›์œผ๋ฉฐ, ํ•„์š”์—†๋‹ค๋ฉด ์•„์˜ˆ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ์•„์˜ˆ ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ.
    ์„ธ์…˜ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ๋ฒ„ํผ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. Connection, Result ๋ฒ„ํผ๋Š” ํด๋ผ์ด์–ธํŠธ ์ปค๋„ฅ์…˜์ด ์‚ด์•„์žˆ๋Š” ๋™์•ˆ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ , Sort Join ๋ฒ„ํผ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์—๋งŒ ์ž ๊น ํ• ๋‹น ๋ฐ›์•˜๋‹ค๊ฐ€ ์™„๋ฃŒ ํ›„ ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•จ.

 


๐Ÿ“Œ ๋ณต์ œ (Replication)

2๋Œ€ ์ด์ƒ์˜ MySQL ์„œ๋ฒ„๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋„๋ก ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” ๊ธฐ์ˆ  ์ด๋‹ค.

๋ณดํ†ต ์ฝ๊ธฐ, ์“ฐ๊ธฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ ๋งˆ์Šคํ„ฐ(Primary)์™€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์Šฌ๋ ˆ์ด๋ธŒ(Replica)๋กœ ๊ตฌ์„ฑํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค.

๊ธฐ์กด์˜ ๋งˆ์Šคํ„ฐ-์Šฌ๋ ˆ์ด๋ธŒ๋ผ๋Š” ์ด๋ฆ„์€ ํ‘์ธ๋น„ํ•˜..๋ผ๋Š” ์ด์œ ๋กœ Primary์™€ Replica ๋˜๋Š” Secondary ๋“ฑ์œผ๋กœ ๋ถ€๋ฅธ๋‹ค. 

 

  • ๋‹จ์ˆœํ•œ ์„œ๋ฒ„ ๋ฐฑ์—…์šฉ๋„๋ฅผ ๋„˜์–ด์„œ, ์“ฐ๊ธฐ ์ž‘์—…์˜ ๊ณผ๋ถ€ํ•˜๊ฐ€ ์ฝ๊ธฐ ์ž‘์—…์— ์˜ํ–ฅ๋ผ์น˜์ง€ ์•Š๋„๋ก ๋‚˜๋ˆŒ ์ˆ˜์žˆ๋‹ค.
  • ํŠนํžˆ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋‹ค๋ณด๋ฉด, ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„, ํ†ต๊ณ„์šฉ์œผ๋กœ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ผ์ด ๋งŽ๋‹ค.
    ์ด ๊ฒฝ์šฐ ๋ณ„๋„์˜ Replica DB ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•ด์„œ ๋‹ด๋‹นํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ์‹ค์ œ ์„œ๋น„์Šค์— ์˜ํ–ฅ์ด ์—†๋‹ค.
  • ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ ์ง€์—ญ Replica DB๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ์บ์‹œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ์‘๋‹ต ์†๋„๋ฅผ ํฌ๊ฒŒ ๊ฐœ์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ, ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ฝ์„ ๋•Œ ๋งˆ์Šคํ„ฐ(Primary)์—์„œ ๊ฐ€์ ธ์™€์•ผ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๋ณ€๊ฒฝ ํ›„ ๋ฐ”๋กœ ์ฝ์–ด๋ฒ„๋ฆฌ๋ฉด Replica DB์— ์•„์ง ๋ฐ˜์˜๋˜์ง€ ์•Š์•„์„œ, ๊ฐ„ํ—์ ์œผ๋กœ null์ด ๋ฐ˜ํ™˜๋˜๋Š” ์œ„ํ—˜์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ

๋งž๋Š” ๋ง์ด์ง€๋งŒ, ๊ฐ™์€ ๋ฉ”์„œ๋“œ์•ˆ์—์„œ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„ํ—์ ์œผ๋กœ null์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋น ๋ฅด๊ฒŒ ๋™๊ธฐํ™”๊ฐ€ ๋˜๋Š”๊ฑด ์•„๋‹ˆ๋ผ์„œ.

Primary DB ์„œ๋ฒ„๋Š” ์„œ๋ฒ„์˜ ๋ณต์ œ๋ฅผ ์œ„ํ•ด MySQL ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์„œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์—๋Š” DML (๋ฐ์ดํ„ฐ ์กฐ์ž‘)์™€ DDL(๋ฐ์ดํ„ฐ ์ •์˜)๋“ฑ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ์ด๋ฒคํŠธ๋“ค์„ ๊ธฐ๋กํ•œ๋‹ค.

 

์ด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ Replica DB๊ฐ€ ๋ฐ›์•„์™€ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ/์ €์žฅํ•œ Relay Log๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, ์ด๋ฅผ ์ฝ์–ด ๋™๊ธฐํ™”๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

์ด ๊ณผ์ •์—๋Š” 2๊ฐœ์˜ Primary ์Šค๋ ˆ๋“œ, 1๊ฐœ์˜ Replica ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

๊ฐ ์Šค๋ ˆ๋“œ๋Š” SHOW REPLICA STATUS ๋ช…๋ น์„ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Replica ์„œ๋ฒ„๋Š” Primary ์„œ๋ฒ„์— ์ ‘์†ํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ์ •๋ณด๋ฅผ ์š”์ฒญํ•œ๋‹ค.
    ์ด ๋•Œ Primary์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ๋คํ”„ ์Šค๋ ˆ๋“œ (Binlog dump thread)๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋กœ๊ทธ๋ฅผ Replica ์„œ๋ฒ„๋กœ ์ „์†กํ•œ๋‹ค.
    ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” Replica์— ์ „์†กํ•  ์ด๋ฒคํŠธ ๋กœ๊ทธ๋ฅผ ์ฝ์„ ๋•Œ ์ผ์‹œ์ ์œผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ์ž ๊ถˆ Thread-Safe ๋ฅผ ๋ณด์žฅํ•จ.
  • Replica ์„œ๋ฒ„์—์„œ START REPLICA ๋ช…๋ น์œผ๋กœ ๋ณต์ œ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด Replication I/O Thread๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
    ์ด ์Šค๋ ˆ๋“œ๋Š” Primary ์„œ๋ฒ„์˜ Binlog dump ์Šค๋ ˆ๋“œ์—์„œ ๋กœ๊ทธ๋ฅผ ๊ฐ€์ ธ์™€ ๋กœ์ปฌ ํŒŒ์ผ์ธ Relay Log์— ๋ณต์‚ฌ/์ €์žฅํ•œ๋‹ค. 
  • ๊ทธ๋ฆฌ๊ณ  Replica ์„œ๋ฒ„์—์„œ Replication SQL Thread๋ฅผ ๋งŒ๋“ค์–ด Relay Log๋ฅผ ์ฝ์–ด๋“ค์ด๊ณ , ๋™๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
    ์ด๋ ‡๊ฒŒ ์“ฐ๊ธฐ(I/O)์™€ ์ฝ๊ธฐ(SQL)๋ฅผ ๋ถ„๋ฆฌ์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์—, Replica DB ๋™๊ธฐํ™” ์†๋„๊ฐ€ ๋Š๋ฆฌ๋”๋ผ๋„ Relay Log๋ฅผ ์ƒ์„ฑ ์‹œ๊ฐ„์—๋Š” ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค.

 

์šฉ์–ด๊ฐ€ ๋‚œํ•ดํ•˜๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ์–ด๋ ต์ง€ ์•Š๋‹ค.

Binary log๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณต๊ตฌ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋”๋ณด๊ธฐ

mysqlbinlog ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์ด์ง„ ํŒŒ์ผ์„ ์‚ฌ๋žŒ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋œฏ์–ด๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑ/์ˆ˜์ •ํ•œ SQL ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋…ผ๋ฆฌ์ ์ธ ์ •๋ณด ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณต๊ตฌ๋Š” ๊ฐ€๋Šฅํ•˜๊ฒ ์ง€๋งŒ, ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ์— ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

 

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

 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ํ†ต์งธ๋กœ ๋ฐฑ์—…ํ•˜๋ ค๋ฉด XtraBackup ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์—๋Š” ์‹ค์ œ๋กœ Maria DB๋ฅผ ๋‚ ๋ ค๋ฒ„๋ ค์„œ Binary Log๋กœ ๋ณต์›ํ–ˆ๋‹ค๋Š” ์ „) ๋ฐฐ๋‹ฌ์˜๋ฏผ์กฑ ์ด์ฃผํ˜„๋‹˜์˜ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค ๐Ÿ˜ƒ

 

 

 

@ ๋ณต์ œ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ํ•˜๋‚˜์˜ Replica๋Š” ํ•˜๋‚˜์˜ Primary๋งŒ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹น์—ฐํ•œ ์ด์•ผ๊ธฐ
  • Replica๋Š” ๋ฐ˜๋“œ์‹œ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๊ตฌ์„ฑํ•ด์•ผํ•œ๋‹ค. ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, Primary์™€์˜ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ, ์ •ํ•ฉ์„ฑ์ด ๊นจ์ง„๋‹ค.
  • Replica์™€ Primary DB์˜ ์„œ๋ฒ„ ์žฅ๋น„ ์‚ฌ์–‘์€ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๋ณต์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ˆ๊นŒ
  • ๋ณต์ œ๋ฅผ ์œ„ํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ์€ ๋งค์šฐ ๋น„์šฉ์ด ํฐ ์ž‘์—…์ด๋‹ค. ๋ณต์ œ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋กœ๊ทธ ์ƒ์„ฑ์„ ๋ฉˆ์ถ”์ž
  • ๊ทธ๋ž˜์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•  ๋•Œ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์„ 2๊ฐ€์ง€ ์ œ๊ณตํ•ด์ค€๋‹ค.
    โžก 1. STATEMENT : Primary DB์— ์‹คํ–‰๋œ ์ฟผ๋ฆฌ ์ž์ฒด๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. / ๋กœ๊ทธ ์šฉ๋Ÿ‰์ด ์ž‘์•„์„œ ๋„คํŠธ์›Œํฌ ๋น„์šฉ์€ ์ค„์–ด๋“ค์ง€๋งŒ ์ฟผ๋ฆฌ์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์•„์•ผํ•ด์„œ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์„ REPEATABLE READ ์ด์ƒ์œผ๋กœ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
    โžก 2. ROW : Primary DB์— ์‹คํ–‰๋œ ์ฟผ๋ฆฌ๋กœ ์ธํ•ด ๋ณ€๊ฒฝ๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. / ๋„คํŠธ์›Œํฌ ๋น„์šฉ์ด ์ปค์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์œผ๋‚˜  ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์„ ์ตœ์†Œํ™”(READ COMMITED) ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ ˆ์ฝ”๋“œ Lock์— ์˜ํ–ฅ์„ ๋œ ๋ผ์นœ๋‹ค.
     

๐Ÿ“Œ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„

MySQL์ด ๋ฐ€๊ณ ์žˆ๋Š” ์—”์ง„์œผ๋กœ, ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ Lock์„ ์ œ๊ณตํ•˜์—ฌ ๋†’์€ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ๋งค์šฐ ์•ˆ์ •์ ์ด๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ [ MySQL์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ]๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์™€๋ณด์ž.

MyISAM ์€ ๊ธฐ์กด์— MySQL์ด ์‚ฌ์šฉํ•ด์™”๋˜ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด๋‹ค.

InnoDB๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๋ฒ„ํผ ํ’€ (์‹ค์ œ ๋ฐ์ดํ„ฐ + insert ๋ฒ„ํผ + Undo ๋ ˆ์ฝ”๋“œ)
  • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ
  • Redo ๋กœ๊ทธ
  • ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ” Space (๊ธฐ์กด์˜ MyISBM์€ ์ด๋ฅผ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•ด์„œ ์†์ƒ๋  ์œ„ํ—˜์ด ์žˆ์—ˆ๋‹ค.)
  • ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ” Space (Cache)

 

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์˜ ํŠน์ง•

  • ํ…Œ์ด๋ธ”์€ Primary Key ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ๋œ๋‹ค. ์ฆ‰ ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ผ์„œ Range Scan์ด ๋งค์šฐ ๋น ๋ฅด๋‹ค.
  • ์‹คํ–‰๊ณ„ํš ๊ฒฐ์ •์— ์žˆ์–ด Primary Key๊ฐ€ ์ธ๋ฑ์Šค๋กœ ์„ ํƒ๋  ํ™•๋ฅ ์ด ๋†’๋‹ค.
  • MVCC๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ Lock์„ ๊ฑธ์ง€ ์•Š๋Š”๋‹ค.
  • ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ์—์„œ ์™ธ๋ž˜ํ‚ค๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ด๋Š” ๋ถ€๋ชจ ํ…Œ์ด๋ธ”๊ณผ ์ž์‹ ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ InnoDB๊ฐ€ ํ•œ๋‹ค๋Š” ๋ง์ด๋ผ์„œ ์ž ๊ธˆ(Lock)์ด ์ „ํŒŒ๋˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค๋ฌด์—์„œ๋Š” ์™ธ๋ž˜ํ‚ค ์ œ์•ฝ์œผ ๊ฑธ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • ์ž๋™ ๋ฐ๋“œ๋ฝ ๊ฐ์ง€๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ MySQL ์—”์ง„์—์„œ ๋ฐœ์ƒํ•œ ํ…Œ์ด๋ธ” ๋ฐ๋“œ๋ฝ์€ ํƒ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ด๋Š” innodb_table_lock ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ ˆ์ฝ”๋“œ ๋ฟ ์•„๋‹ˆ๋ผ ํ…Œ์ด๋ธ” ๋ ˆ๋ฒจ์˜ ๋ฐ๋“œ๋ฝ๋„ ๊ฐ์ง€ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„œ๋ฒ„ ์‹œ์ž‘์‹œ ํŠธ๋žœ์žญ์…˜/๋””์Šคํฌ์— ๊ธฐ๋ก๋œ ์žฅ์• ๋ฅผ ์ž๋™์œผ๋กœ ๋ณต๊ตฌํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

@ InnoDB ๋ฒ„ํผ ํ’€์ด๋ž€?

๋””์Šคํฌ์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด๋‚˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œํ•ด๋‘๋Š” ๊ณต๊ฐ„์ด๋‹ค. 

์‹ค์ง์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋Œ€๋ถ€๋ถ„์„ ๋ฒ„ํผ ํ’€์ด ์ฐจ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹น์—ฐํžˆ ํฌ๊ธฐ๊ฐ€ ํด ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋œ๋‹ค. ๋‹ค๋งŒ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ์„œ๋ฒ„ RAM ์˜ 50% ์ •๋„๋กœ ํ• ๋‹นํ•ด๋†จ๋‹ค๊ฐ€, ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ณด๋ฉฐ ์กฐ๊ธˆ์”ฉ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋ฒ„ํผ ํ’€์„ ๋Š˜๋ฆฌ๋Š”๊ฑด ์‰ฝ์ง€๋งŒ ์ค„์ด๋Š”๊ฑด ๋งค์šฐ ๋ถ€๋‹ด์Šค๋Ÿฌ์šด ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ.

InnoDB์˜ ์ „์ฒด์ ์ธ ๊ทธ๋ฆผ. ์™ผ์ชฝ ์œ„์— ๋ฒ„ํผํ’€์˜ ๋™์ž‘ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ์žˆ๋‹ค.

์ฟผ๋ฆฌ๋กœ ์ธํ•ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ๋ ˆ์ฝ”๋“œ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ์ด๊ณณ ์ €๊ณณ์— ์œ„์น˜ํ•œ๋‹ค.

์ด๋ฅผ ๋ฒ„ํผ๋กœ ํ•œ๋ฒˆ์— ๋ชจ์•„์„œ ์“ฐ๊ธฐ ์ž‘์—…์„ ๋งŒ๋“œ๋Š” "์“ฐ๊ธฐ ์ง€์—ฐ"์˜ ์—ญํ• ์„ ํ•˜๋ฉฐ Durty Page (์•„์ง ๋””์Šคํฌ์—๋Š” ๊ธฐ๋ก๋˜์ง€ ์•Š์€ ๊ณต๊ฐ„)๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜์—ฌ ๋””์Šคํฌ์— ์ €์žฅํ•œ๋‹ค.

 

๊ธฐ์กด์˜ InnoDB ๋ฒ„ํผํ’€์€ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋กœ ์ธํ•ด ๋ฒ„ํผํ’€์— ์Šค๋ ˆ๋“œ ๊ฒฝํ•ฉ์— ์˜ํ•œ Lock์ด ๋งŽ์ด ๋ฐœ์ƒํ–ˆ๊ณ , ํ˜„์žฌ๋Š” ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ฒ„ํผ ํ’€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. innodb_buffer_pool_instances ๋ณ€์ˆ˜๋กœ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์ • ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ, ๋ฒ„ํผํ’€์— ํ• ๋‹น๋œ ํฌ๊ธฐ๊ฐ€ 1GB ๋ฏธ๋งŒ์ด๋ผ๋ฉด 1๊ฐœ๋งŒ ์ƒ์„ฑ๋œ๋‹ค.

 

Insert๋‚˜ Update๋“ฑ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•  ๋•Œ์—๋Š”, ๊ทธ ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ด€๋œ ์ธ๋ฑ์Šค๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ด๋Š” ์ž‘์—…์†Œ๋ชจ๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, InnoDB ๋ฒ„ํผํ’€์— ๋ณ€๊ฒฝํ•ดํ–ํ•  ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•  ์ž„์‹œ๊ณต๊ฐ„( Change buffer )์„ ๋งŒ๋“ค์–ด๋‘”๋‹ค.

 

[ Change Buffer ]์—๋Š” ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ด€๋˜์–ด ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ธ๋ฑ์Šค ํŽ˜์ด์ง€๋ฅผ ์ €์žฅํ•ด๋‘๊ณ , ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ ํ•˜์ง€ ์•Š๊ณ  ์“ฐ๊ธฐ์ง€์—ฐ์„ ํ†ตํ•ด ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

@ InnoDB๊ฐ€ ๋ฒ„ํผํ’€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฒ„ํผ ํ’€์€ 3๊ฐ€์ง€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๋กœ ์ž‘๋™ํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

  • LRU + MRU ๋ฆฌ์ŠคํŠธ [ page_new, page1, page2, page3, ...., page_old ]
    (Most Recnetly Used, ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ฌ์šฉ ํ•œ ํŽ˜์ด์ง€ <-> Least Recently Used, ๊ฐ€์žฅ ์˜ค๋žซ๋™์•ˆ ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ํŽ˜์ด์ง€)
  • Flush ๋ฆฌ์ŠคํŠธ - ๋””์Šคํฌ์— ๊ธฐ๋กํ•  Durty ํŽ˜์ด์ง€๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„
  • Free ๋ฆฌ์ŠคํŠธ - ์ˆ˜์ •๋˜์ง€ ์•Š์€ Clean ํŽ˜์ด์ง€๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„ ( LRU+MRU์— ์žˆ๋Š” Clean ํŽ˜์ด์ง€๊ฐ€ ์—ฌ๊ธฐ๋กœ ์˜ฎ๊ฒจ์ง )

 

  • 1-1. InnoDB๋Š” ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ(๋ ˆ์ฝ”๋“œ)๊ฐ€ ์žˆ๋‹ค๋ฉด ๋จผ์ € ๋ฒ„ํผ ํ’€์— ์กด์žฌ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.
    ( ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‰ฌ ์ธ๋ฑ์Šค๋กœ ํŽ˜์ด์ง€๊ฒ€์ƒ‰ โžก ํ…Œ์ด๋ธ” ์ธ๋ฑ์Šค B-Tree๋ฅผ ์ด์šฉํ•ด ๋ฒ„ํผํ’€ ํƒ์ƒ‰ โžก ์ฐพ์•˜๋‹ค๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€ ํฌ์ธํ„ฐ๋ฅผ MRU ์ชฝ์œผ๋กœ ์Šน๊ธ‰)
  • 1-2. ๋งŒ์•ฝ ๋ฒ„ํผํ’€์— ์—†๋‹ค๋ฉด, ๋””์Šคํฌ๋ฅผ ์ฝ์–ด ๋ฒ„ํผํ’€์— ์ ์žฌํ•˜๊ณ  ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ํฌ์ธํ„ฐ๋ฅผ LRU ํ—ค๋”์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • 2. ์ž‘๋™ํ•˜๋‹ค๊ฐ€ LRU ํ—ค๋” ๋ถ€๋ถ„์— ์ ์žฌ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฝํžŒ๋‹ค๋ฉด MRU ๋ฐฉํ–ฅ์œผ๋กœ ํฌ์ธํ„ฐ๋ฅผ ์ด๋™ํ•œ๋‹ค.
    ๋‹จ ๋Œ€๋Ÿ‰ ์ฝ๊ธฐ์˜ ๊ฒฝ์šฐ ์‹ค์ œ ์ฟผ๋ฆฌ๋ณด๋‹ค ๋” ๋งŽ์€๋Ÿ‰์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ๋Š” MRU ์ด๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • 3. ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ LRU ๋๋ถ€๋ถ„์œผ๋กœ ๋ฐ€๋ ค๋‚œ ๊ฒฝ์šฐ(Aging) ๋ฒ„ํผ ํ’€์˜ ๊ณต๊ฐ„์„ ํ™•๋ณด(Eviction)ํ•  ๋•Œ ์‚ญ์ œ๋œ๋‹ค.
  • 4. ๋ฐ˜๋Œ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ์ ‘๊ทผ๋˜์–ด MRU ๋ถ€๋ถ„์œผ๋กœ ์™”๋‹ค๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ [ ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‹œ ์ธ๋ฑ์Šค ]์— ์ถ”๊ฐ€ํ•œ๋‹ค.

 

๋‹ค๋งŒ ์ด๋ ‡๊ฒŒ ๋ฒ„ํผ๋ฅผ ๊ฑฐ์ณ์„œ ๋™์ž‘ํ•˜๊ฒŒ๋˜๋ฉด, ์‹ค์ œ ๋””์Šคํฌ์—๋Š” ๋‚˜์ค‘์— ๊ธฐ๋ก๋˜๋ฏ€๋กœ DB์˜ ACID๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ž˜์„œ InnoDB๋Š” ReDo ๋กœ๊ทธ๋ผ๋Š”๊ฑธ ์‚ฌ์šฉํ•œ๋‹ค.

Redo Log๋Š” ํ•˜๋‚˜๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉ๊ฐ€๋Šฅ.

InnoDB ๋ฒ„ํผํ’€์—๋Š” ๋””์Šคํฌ์™€ ๋™์ผํ•œ ์ƒํƒœ์ธ Clean Page์™€ ์ฟผ๋ฆฌ๋กœ ๋ณ€๊ฒฝ๋œ Durty Page๊ฐ€ ํ•จ๊ป˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

Redo ๋กœ๊ทธ๋Š” Durty Page์˜ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ์ด๋ฉฐ ์•ž๊ณผ ๋’ค๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ˆœํ™˜ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค.

์ฆ‰, ๊ณ„์† ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด Redo ๋กœ๊ทธ์— ์žˆ๋Š” ์ง„์ž…์ (Log Entry)์€ ์–ธ์  ๊ฐ€ ๋ฎ์–ด ์”Œ์›Œ์ง€๊ฒŒ ๋œ๋‹ค.

 

์—ฌ๊ธฐ์—์„œ ์•„์ง ๊ธฐ๋ก์ด ์•ˆ๋˜์„œ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ณณ์„ Active Redo Log์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ๊ทธ๋Š” ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š” ์ˆซ์ž์ธ LSN (Log Sequence Number)์„ ์‚ฌ์šฉํ•œ๋‹ค. InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ์ฃผ๊ธฐ์ ์œผ๋กœ Redo๋กœ๊ทธ์˜ ๋‚ด์šฉ์„ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š” ์ฒดํฌํฌ์ธํŠธ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š”๋ฐ ์ด ๋•Œ LSN์„ ๊ธฐ์ค€์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ LSN์„ ์ด์šฉํ•ด์„œ ๊ฐ€์žฅ ์ตœ๊ทผ ์ฒดํฌํฌ์ธํŠธ์™€ ๋งˆ์ง€๋ง‰ Redo log ์—”ํŠธ๋ฆฌ์˜ ์ฐจ์ด๋ฅผ [ Checkpoint Age ]๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์•„์ง ๋””์Šคํฌ์— ์ €์žฅ๋˜์ง€ ์•Š์€ ํŽ˜์ด์ง€ ๊ฐœ์ˆ˜์ด๋‹ค.

 

์ฐธ๊ณ ๋กœ Redo ๋กœ๊ทธ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋‚ญ๋น„๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ๊ธฐ๋กํ•ด๋‘”๋‹ค.

๊ทธ๋ž˜์„œ ํ•˜๋“œ์›จ์–ด ์˜ค์ž‘๋™, ์„œ๋ฒ„ ๋‹ค์šด๋“ฑ์ด ๋ฐœ์ƒํ•˜๋ฉด Redo๋กœ๊ทธ๋งŒ์œผ๋กœ๋Š” ๋ณต๊ตฌ ํ•  ์ˆ˜ ์—†๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด InnoDB์—์„œ Double Write Buffer๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๊ธฐ ์ „, ๋”ฐ๋กœ InnoDB ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”๊ณต๊ฐ„(DoubleWrite Buffer)์— ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ๋ณต์‚ฌํ•ด๋‘”๋‹ค. ์ด๋Š” MySQL ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ '๋ณต๊ตฌ' ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋Œ€์ถฉ ๊ธฐ๋ก๋งŒ ํ•ด๋‘๊ณ  ๋งŒ์•ฝ ํ•˜๋“œ์›จ์–ด ์˜ค์ž‘๋™, ์„œ๋ฒ„ ์žฅ์• ๋“ฑ์ด ๋‚ฌ์„ ๋–„ DoubleWrite ๋ฒ„ํผ ๋‚ด์šฉ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ชจ๋‘ ๋น„๊ตํ•ด์„œ ๋‹ค๋ฅธ ๋‚ด์šฉ์„ ๋‹ด์€ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋ฒ„ํผ์— ์žˆ๋Š” ๋‚ด์šฉ์œผ๋กœ ๋ฎ์–ด์”Œ์šด๋‹ค. 

 

๋‚ด์šฉ์„ ๋ณด๋ฉด I/O ์ž‘์—…์— ์ƒ๋‹นํ•œ ๋ถ€ํ•˜๋ฅผ ์ค„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ํ•˜๋“œ๋””์Šคํฌ์˜ ํŠน์„ฑ์ƒ ์—ฐ์†๋œ ์ˆœ์ฐจ๊ธฐ๋ก์€ ๊ฑฐ์˜ ๋ถ€๋‹ด์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋‹ค๋งŒ SSD์˜ ๊ฒฝ์šฐ ๋žœ๋ค I/O์™€ ์ˆœ์ฐจ I/O ๋‘˜ ๋‹ค ๋ถ€๋‹ด์ด ๋˜๊ธฐ ๋–„๋ฌธ์— ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ innodb_doublewrite ๋ณ€์ˆ˜๋กœ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

๋งŒ์•ฝ ์„ฑ๋Šฅ์„ ๋†’์ด๋ ค๊ณ  [Redo ๋กœ๊ทธ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ]_(innodb_flush_log_at_trx_commit) ์„ offํ–ˆ๋‹ค๋ฉด, ์ด ๊ธฐ๋Šฅ๋„ ํ•จ๊ป˜ ๊บผ์„œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ค๋„๋ก ํ•˜์ž. 

 

@ ์ด๋ ‡๊ฒŒ๊นŒ์ง€ Redo๋กœ๊ทธ๋ฅผ ์„ค๋ช…ํ•œ ์ด์œ ๋Š”, ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

1 ๋ฒ„ํผํ’€์€ 100GB ์ธ๋ฐ, Redo ๋กœ๊ทธ์˜ ์ „์ฒด ํฌ๊ธฐ๋Š” 100MB์ธ ๊ฒฝ์šฐ
2 ๋ฒ„ํผํ’€์€ 100MB ์ธ๋ฐ, Redo ๋กœ๊ทธ์˜ ์ „์ฒด ํฌ๊ธฐ๋Š” 100GB์ธ ๊ฒฝ์šฐ

1๋ฒˆ์˜ ๊ฒฝ์šฐ Redo๋กœ๊ทธ์˜ ํฌ๊ธฐ๊ฐ€ 100MB๋ผ์„œ, ๋กœ๊ทธ์˜ ํฌ๊ธฐ(Checkpoint Age)๋Š” ์ตœ๋Œ€ 100MB๋งŒ ํ—ˆ์šฉ๋œ๋‹ค.

๋งŒ์•ฝ ํ‰๊ท ์ ์ธ ๋กœ๊ทธ์˜ ํฌ๊ธฐ๊ฐ€ 4KB๋ผ๋ฉด, ๋Œ€์ถฉ 25600๊ฐœ์˜ ํŽ˜์ด์ง€๋งŒ ๋ฒ„ํผ ํ’€์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฒ„ํผํ’€์„ ์•„๋ฌด๋ฆฌ ํฌ๊ฒŒ ํ• ๋‹นํ•œ๋‹ค๊ณ  ํ•œ๋“ค, Redo ๋กœ๊ทธ ํฌ๊ธฐ๊ฐ€ ๋ถ€์กฑํ•ด์„œ ๋Œ€๋ถ€๋ถ„(99G ์ •๋„๊ฐ€) ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋น„์–ด์žˆ๊ฒŒ ๋œ๋‹ค.

 

2๋ฒˆ์˜ ๊ฒฝ์šฐ ์ด๋ก ์ ์œผ๋กœ๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค. ๊ทธ๋ƒฅ ๋ฒ„ํผ ํ’€์ด ์ž‘์€๊ฑฐ๋‹ˆ๊นŒ

ํ•˜์ง€๋งŒ JVM์˜ GC๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. 2๋ฒˆ์˜ ์ƒํƒœ๋กœ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•ด์„œ Checkpoint Age๊ฐ€ ์–ด๋งˆ์–ด๋งˆํ•˜๊ฒŒ ์ปค์ง„๋‹ค๋ฉด, ์–ด๋–ค ์ƒํ™ฉ์ด ๋ฐœ์ƒํ• ๊นŒ? InnoDB ์—”์ง„์€ ํ•œ๋ฒˆ์— ์–ด๋งˆ์–ด๋งˆํ•œ ๋””์Šคํฌ ์ž‘์—…์„ ๋ฐ›๊ฒŒ๋˜์–ด ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ด๋‹ค.

 

 

 

@ MVCC (Multi Version Concurrency Control), Undo ๋กœ๊ทธ

Undo ๋กœ๊ทธ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ (Update, Delete) ๋ณ€๊ฒฝ๋˜๊ธฐ ์ด์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.

๋กค๋ฐฑ์ด๋‚˜ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์— ๋Œ€์‘ํ•˜๋Š” MVCC์— ์‚ฌ์šฉ๋œ๋‹ค.

 

MVCC๋Š” ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์‰ฝ๊ฒŒ๋งํ•ด ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹/๋กค๋ฐฑ ์—ฌ๋ถ€๋ž‘ ๊ด€๊ณ„์—†์ด, ํ•ญ์ƒ ๋ณ€๊ฒฝ ์ด์ „์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ Undo๋กœ๊ทธ์— ๋‚จ๊ฒจ๋‘”๋‹ค.

 

๊ตณ์ด ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ(REPEATABLE READ)๋ฅผ ์Šค๋ ˆ๋“œ Lock ์—†์ด ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์ฝ์—ˆ์„ ๋•Œ, ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š” ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๋ฅผ Undo ๋กœ๊ทธ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.

์ฒ˜์Œ ์ฝ์—ˆ์„ ๋• Jeju์˜€๋Š”๋ฐ, ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ Commitํ•ด๋ฒ„๋ ค์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋ฒ„๋ฆฌ๋ฉด? ๋‚œ๊ฐํ•˜๋‹ค. ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜์ธ๋ฐ ๋‹ค์‹œ ์ฝ์œผ๋ฉด ๊ฐ’์ด ๋ฐ”๋€๋‹ค.

๋‹จ, ์ด๋ ‡๊ฒŒ Undo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์˜ ๋ฒ”์œ„๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ์ด์ „ ๋ฒ„์ „์˜ ๋ ˆ์ฝ”๋“œ(๋ฐ์ดํ„ฐ)๋“ค์ด ์Œ“์—ฌ์„œ ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”์„ ๋‚ญ๋น„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— [REPEATABLE_READ๋ฅผ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์œผ๋กœ ์‚ฌ์šฉ]ํ•œ๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

'๐ŸŒฑBackend > DB(MySQL,PostgreSQL)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ •๋ฆฌ์ค‘-5  (0) 2021.10.27
์ •๋ฆฌ์ค‘ - 4  (0) 2021.10.20
์ •๋ฆฌ์ค‘ - 3  (0) 2021.10.20
์ •๋ฆฌ์ค‘ #1 ์—”์ง„ ์•„ํ‚คํ…์ฒ˜  (0) 2021.10.13
1. MySQL์€ ๋ฌด์—‡์ธ๊ฐ€  (0) 2021.10.13

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ