Buffer Pool

  • InnoDB ๋ฒ„ํผ ํ’€์€ InnoDB์—์„œ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„
  • MySQL ์„ฑ๋Šฅ ํŠœ๋‹์˜ ์ค‘์š”ํ•œ ์ธก๋ฉด
  • innodb_buffer_pool_size๋กœ ์„ค์ •ํ•˜๊ณ , ์ „์ฒด ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์˜ 50~80% ์ˆ˜์ค€์œผ๋กœ ์„ค์ •
  • ๋ฒ„ํผ ํ’€ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํŽ˜์ด์ง•๊ณผ ์บ์‹œ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ
  • ์ธ๋ฑ์Šค ์„ค๊ณ„์— ์ž˜ ๋˜์–ด ์žˆ์ง€๋งŒ ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด ๋ถ€๋ถ„์„ ์˜์‹ฌํ•ด ๋ด์•ผ ํ•œ๋‹ค.
  • ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ ํ™•์ธ ์ฟผ๋ฆฌ
SHOW STATUS LIKE '%innodb_buffer_pool%';

 

innodb_buffer_pool_size

  • ๋ฒ„ํผ ํ’€์˜ ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก ์„ฑ๋Šฅ์— ์œ ๋ฆฌํ•จ
    • ๋ฒ„ํผ ํ’€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํžˆ ํฐ ์–‘์œผ๋กœ ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค๋ฉด innodb๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ฒ˜๋Ÿผ ๋™์ž‘
  • ๋””์Šคํฌ์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด๋‚˜ ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œํ•ด ๋‘๋Š” ๊ณต๊ฐ„ + ์“ฐ๊ธฐ ์ž‘์—…์„ ์ง€์—ฐ์‹œ์ผœ ์ผ๊ด„ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฒ„ํผ ์—ญํ• 
    • SELECT๋ฅผ ์œ„ํ•œ ์บ์‹œ ํšจ๊ณผ๊ฐ€ ํฌ๋‹ค -> ์ฝ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์™€ ์žˆ์–ด ๋””์Šคํฌ ์ž‘์—…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!
    • INSERT, UPDATE ๋ฐ DELETE์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” ๋””์Šคํฌ ์ž‘์—…์„ ๋ฐœ์ƒ์‹œํ‚ด -> ๋ฒ„ํผ ํ’€์ด ์žˆ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„์„œ ์ฒ˜๋ฆฌํ•ด์„œ ๋žœ๋คํ•œ ๋””์Šคํฌ ์ž‘์—… ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค!
    • => ๋‹ค๋ฅธ ๋ฒ„ํผ์— ํ• ๋‹นํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฒ„ํผ ํ’€์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

innodb_buffer_pool_chunk_size

  • ๋ฒ„ํผํ’€ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• 
    • ๊ธฐ๋ณธ๊ฐ’ = 128M
  • ์ฝ”์–ด ์ˆ˜๊ฐ€ ์ ๋‹ค๋ฉด ์ด ๊ฐ’์„ ๋Š˜๋ ค์„œ ๋ฒ„ํผ ํ’€์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ ค์•ผ ํ•จ

 

innodb_buffer_pool_instances

  • ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋ฉด ํŠธ๋žœ์žญ์…˜ ๊ฐ„ Lock ๊ฒฝํ•ฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
    • MySQL์€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ๊ตฌ์กฐ -> ์“ฐ๋ ˆ๋“œ ๊ฐ„ ๋ฒ„ํผ ํ’€ ์กฐ์ž‘์—์„œ exclusive lock ์ฒ˜๋ฆฌ ํ•„์š”
    • ๋ฒ„ํผ ํ’€ ์ ‘๊ทผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฎคํ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฎคํ…์Šค์— ๋Œ€ํ•œ ๊ฒฝํ•ฉ ๋ฐœ์ƒ
    • => ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ๋Š˜๋ฆด์ˆ˜๋ก ๋งŽ์€ ์ˆ˜์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋ฒ„ํผ ํ’€์— ์ ‘๊ทผํ•˜๋”๋ผ๋„ Lock ๊ฒฝํ•ฉ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • CPU ์ฝ”์–ด ์ˆ˜๊ฐ€ ๋งŽ์€ ์‹œ์Šคํ…œ์ผ์ˆ˜๋ก ์ธ์Šคํ„ด์Šค ์ˆ˜๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋‹ค.
    • ์ธ์Šคํ„ด์Šค ์ˆ˜ ๊ธฐ๋ณธ๊ฐ’ = 8

 

โญ๏ธ ๋ฒ„ํผ ํ’€ ํฌ๊ธฐ = innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances์˜ ๋ฐฐ์ˆ˜

innodb_buffer_pool_size๋ฅผ innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances์™€ ๊ฐ™์ง€ ์•Š์€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑํ•˜๋ฉด ๋ฒ„ํผ ํ’€ ํฌ๊ธฐ๋Š” ์ž๋™์œผ๋กœ innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances์˜ ๋ฐฐ์ˆ˜์™€ ๊ฐ™๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๊ฐ’์œผ๋กœ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค.

RealMySQL 8.0 ์„ ์ฝ๊ณ  ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์•„ํ‚คํ…์ฒ˜

InnoDB → MySQL์˜ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๊ฐ€์šด๋ฐ

  • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ ,
  • ๊ฑฐ์˜ ์œ ์ผํ•˜๊ฒŒ ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ž ๊ธˆ์„ ์ œ๊ณตํ•˜์—ฌ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ์•ˆ์ •์ ์ด๋ฉฐ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ
  • ๊ตฌ์กฐ

4.2.1 ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค์— ์˜ํ•œ ํด๋Ÿฌ์Šคํ„ฐ๋ง

  • InnoDB์˜ ๋ชจ๋“  ํ…Œ์ด๋ธ”์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋˜์–ด ์ €์žฅ → ์ฆ‰, ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค ๊ฐ’์˜ ์ˆœ์„œ๋Œ€๋กœ ๋””์Šคํฌ์— ์ €์žฅ๋˜์–ด → ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค์— ์˜ํ•œ ์Šค์บ”์€ ์ƒ๋‹นํžˆ ๋นจ๋ฆฌ ์ฒ˜๋ฆฌ๋จ
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์—์„œ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋Š” ๋‹ค๋ฅธ ๋ณด์กฐ ์ธ๋ฑ์Šค์— ๋น„ํ•ด ๋†’์€ ๋น„์ค‘์œผ๋กœ ์„ค์ •
    • InnoDB ํ…Œ์ด๋ธ” ๊ตฌ์กฐ = ์˜ค๋ผํด์˜ IOT(Index Organized Table) ๊ตฌ์กฐ

4.2.2 ์™ธ๋ž˜ ํ‚ค ์ง€์›

  • Only InnoDB, not MyISAM๊ณผ MEMORY ํ…Œ์ด๋ธ”
  • ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ œ์•ฝ์‚ฌํ•ญ์ด ์žˆ์–ด ์‹ค๋ฌด์—์„œ๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
  • InnoDB์˜ ์™ธ๋ž˜ ํ‚ค๋Š” ๋ถ€๋ชจ ํ…Œ์ด๋ธ”๊ณผ ์ž์‹ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ํ•ด๋‹น ์นผ๋Ÿผ์— ์ธ๋ฑ์Šค ์ƒ์„ฑ์ด ํ•„์š”ํ•˜๊ณ , ๋ณ€๊ฒฝ ์‹œ์—๋Š” ๋ฐ˜๋“œ์‹œ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์ด๋‚˜ ์ž์‹ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ž ๊ธˆ์ด ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”๋กœ ์ „ํŒŒ๋˜๊ณ , ๊ทธ๋กœ ์ธํ•ด ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ๋•Œ๊ฐ€ ๋งŽ์•„์„œ ์‹ค๋ฌด์—์„œ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

4.2.3 MVCC(Multi Version Concurrency Control)

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ ˆ์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” DBMS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ
  • MVCC์˜ ๊ฐ€์žฅ ํฐ ๋ชฉ์ ์€ ์ž ๊ธˆ ์—†๋Š” ์ผ๊ด€๋œ ์ฝ๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ → InnoDB๋Š” ์–ธ๋‘ ๋กœ๊ทธ๋ฅผ ์ด์šฉํ•ด ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•จ
  • ex) ‘์œ ์žฌ์„’์—์„œ ‘ํ™๊ธธ๋™’์œผ๋กœ UPDATE
mysql > UPDATE member SET name='ํ™๊ธธ๋™' WHERE member_id='1';

์ด ๋•Œ์˜ ์ƒํ™ฉ

  1. InnoDB ๋ฒ„ํผ ํ’€ : ์ˆ˜์ • ํ›„ ‘ํ™๊ธธ๋™'์ด ๋ฐ˜์˜๋จ (๋ ˆ์ฝ”๋“œ ์ „์ฒด)
  2. ์–ธ๋‘ ๋กœ๊ทธ : ์ˆ˜์ • ์ „ ‘์œ ์žฌ์„'์ด ๋ฐ˜์˜๋จ (PK, ๋ฉ”ํƒ€์ •๋ณด ๋ฐ ์ˆ˜์ •๋œ ์นผ๋Ÿผ๋งŒ ๋ฐฑ์—…)

→ ์ด ๋•Œ, ์ปค๋ฐ‹์ด๋‚˜ ๋กค๋ฐฑ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ 2๋ฒˆ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

๊ฒฐ๋ก  : ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

  • READ_UNCOMMITTED : InnoDB ๋ฒ„ํผ ํ’€์ด๋‚˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ ‘ํ™๊ธธ๋™' ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • READ_COMMITTED ์ด์ƒ : ์•„์ง ์ปค๋ฐ‹๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ๋‘ ์˜์—ญ์˜ '์œ ์žฌ์„' ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ DBMS ์—์„œ๋Š” MVCC ๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

4.2.4 ์ž ๊ธˆ ์—†๋Š” ์ผ๊ด€๋œ ์ฝ๊ธฐ(Non-Locking Consistent Read)

  • InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ MVCC๋ฅผ ์ด์šฉํ•ด INSERT์™€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์ˆœ์ˆ˜ํ•œ SELECT ์ž‘์—…์€ ๋ฝ์„ ๊ฑธ์ง€ ์•Š๊ณ , ๋ฐ”๋กœ ์ˆ˜ํ–‰
    • ๋ฝ์„ ๊ฑธ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฝ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Œ
    • ์ฝ๊ธฐ ์ž‘์—… ๊ฐ€๋Šฅ(serializable ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ์ œ์™ธ)
    • lock์ด ๊ฑธ๋ ค์žˆ์–ด๋„ ์ฝ์„ ๋•Œ๋Š” ์–ธ๋‘ ์˜์—ญ์—์„œ ์ฝ๊ธฐ ๋•Œ๋ฌธ์— lock์ด ๊ฑธ๋ฆฌ๋“  ๋ง๋“  ์ƒ๊ด€์—†์ด ์ด์ „ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

4.2.5 ์ž๋™ ๋ฐ๋“œ๋ฝ ๊ฐ์ง€

  • InnoDB๋Š” ๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜์˜ ๋ฐ๋“œ๋ฝ ์ฒดํฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉ → ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•จ๊ณผ ๋™์‹œ์— ๋ฐ”๋กœ ๊ฐ์ง€๋˜๊ณ , ๊ฐ์ง€๋œ ๋ฐ๋“œ๋ฝ์€ ๊ด€๋ จ ํŠธ๋žœ์žญ์…˜ ์ค‘์—์„œ ROLLBACK์ด ๊ฐ€์žฅ ์šฉ์ดํ•œ ํŠธ๋žœ์žญ์…˜(ROLLBACK์„ ํ–ˆ์„ ๋•Œ ๋ณต๊ตฌ ์ž‘์—…์ด ๊ฐ€์žฅ ์ž‘์€ ํŠธ๋žœ์žญ์…˜, ์ฆ‰ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์žฅ ์ ๊ฒŒ ๋ณ€๊ฒฝํ•œ ํŠธ๋žœ์žญ์…˜)์„ ์ž๋™์ ์œผ๋กœ ๊ฐ•์ œ ์ข…๋ฃŒํ•ด ๋ฒ„๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ๋“œ๋ฝ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ๊ฐ€ ์ œํ•œ์‹œ๊ฐ„(Timeout)์— ๋„๋‹ฌํ•˜๊ฑฐ๋‚˜ ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ๋กœ ๊ธฐ๋ก๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ง€ ์•Š๋‹ค.

4.2.6 ์ž๋™ํ™”๋œ ์žฅ์•  ๋ณต๊ตฌ

  • InnoDB๋Š” ์†์‹ค์ด๋‚˜ ์žฅ์• ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋งค์ปค๋‹ˆ์ฆ˜์ด ํƒ‘์žฌ!
    • MySQL ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋  ๋•Œ, ์™„๋ฃŒ๋˜์ง€ ๋ชปํ•œ ํŠธ๋žœ์žญ์…˜์ด๋‚˜ ๋””์Šคํฌ์— ์ผ๋ถ€๋งŒ ๊ธฐ๋ก๋œ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€(Partial write) ๋“ฑ์— ๋Œ€ํ•œ ์ผ๋ จ์˜ ๋ณต๊ตฌ ์ž‘์—…์ด ์ž๋™์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

4.2.7 InnoDB ๋ฒ„ํผ ํ’€

  • InnoDB์—์„œ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„
  • innodb_buffer_pool_size ๋กœ ์„ค์ •, ์ „์ฒด ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์˜ 50~80% ์ˆ˜์ค€์œผ๋กœ ์„ค์ •
  • ๋””์Šคํฌ์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด๋‚˜ ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œํ•ด ๋‘๋Š” ๊ณต๊ฐ„ + ์“ฐ๊ธฐ ์ž‘์—…์„ ์ง€์—ฐ์‹œ์ผœ ์ผ๊ด„ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฒ„ํผ ์—ญํ•  → INSERT๋‚˜ UPDATE ๊ทธ๋ฆฌ๊ณ  DELETE์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” ๋””์Šคํฌ ์ž‘์—…์„ ๋ฐœ์ƒ์‹œํ‚ด → ๋ฒ„ํผ ํ’€์ด ์žˆ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด ๋žœ๋คํ•œ ๋””์Šคํฌ ์ž‘์—…์˜ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค!
  • ์•„์ง ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. → ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋”ํ‹ฐ ํŽ˜์ด์ง€(Dirty page)
  • ๋”ํ‹ฐ ํŽ˜์ด์ง€๋Š” InnoDB์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋˜๋Š” ์–ด๋–ค ์กฐ๊ฑด์ด ๋˜๋ฉด ์ฒดํฌํฌ์ธํŠธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋•Œ Write ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•œ ๋งŒํผ์˜ ๋”ํ‹ฐ ํŽ˜์ด์ง€๋งŒ ๋””์Šคํฌ๋กœ ๊ธฐ๋กํ•œ๋‹ค. ์ฒดํฌํฌ์ธํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฒ„ํผ ํ’€์˜ ๋ชจ๋“  ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ๋กœ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

4.2.8 Double Write Buffer

  • ํŒŒ์…œ ํŽ˜์ด์ง€(Partial-page) or ํ†ค ํŽ˜์ด์ง€(Ton-page) : ํŽ˜์ด์ง€๊ฐ€ ์ผ๋ถ€๋งŒ ๊ธฐ๋ก๋˜๋Š” ํ˜„์ƒ, ํ•˜๋“œ์›จ์–ด ์˜ค์ž‘๋™์ด๋‚˜ ์‹œ์Šคํ…œ ๋น„์ •์ƒ ์ข…๋ฃŒ ๋“ฑ์œผ๋กœ ๋ฐœ์ƒํ•จ
  • InnoDB์˜ ๋ฆฌ๋‘ ๋กœ๊ทธ๋Š” ๊ณต๊ฐ„์˜ ๋‚ญ๋น„๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํŽ˜์ด์ง€์˜ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ๋งŒ์„ ๊ธฐ๋กํ•จ → ์ด๋กœ ์ธํ•ด InnoDB์—์„œ ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ ํŒŒ์ผ๋กœ ํ”Œ๋Ÿฌ์‹œํ•  ๋•Œ ์ผ๋ถ€๋งŒ ๊ธฐ๋ก๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€๋Š” ๋ณต๊ตฌ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜๋„.. → ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด Double Write ๊ธฐ๋ฒ•์„ ์ด์šฉ!

4.2.9 ์–ธ๋‘(Undo) ๋กœ๊ทธ

  • ex) ‘์œ ์žฌ์„’์—์„œ ‘ํ™๊ธธ๋™’์œผ๋กœ UPDATE
mysql > UPDATE member SET name='ํ™๊ธธ๋™' WHERE member_id='1';
  • ์–ธ๋‘ ์˜์—ญ : when? UPDATE๋‚˜ DELETE ๋ฌธ์žฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ why? ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ ์ž ์‚ฌ์šฉ
  • ์–ธ๋‘ ๋ฐ์ดํ„ฐ : ex) ์–ธ๋‘ ๋ฐ์ดํ„ฐ ‘์œ ์žฌ์„’ why?
  1. ํŠธ๋žœ์žญ์…˜์˜ rollback ๋Œ€๋น„์šฉ
  2. ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋†’์€ ๋™์‹œ์„ฑ ์ œ๊ณตํ•ด์ค˜์„œ
    • ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ : ๋™์‹œ์— ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•  ๋•Œ, ํ•œ ํŠธ๋žœ์žญ์…˜์˜ ์ž‘์—… ๋‚ด์šฉ์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์งˆ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ธฐ์ค€

4.2.10 ์ฒด์ธ์ง€ ๋ฒ„ํผ

  • ์ธ๋ฑ์Šค ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ์ž์› ์†Œ๋ชจ๋ฅผ ์ค„์—ฌ์ฃผ๋Š” ์ž„์‹œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„

ํƒ„์ƒ ๋ฐฐ๊ฒฝ

  • ๐Ÿง ๋ฌธ์ œ : INSERT๋‚˜ UPDATE ๋  ๋•Œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—… + ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ํฌํ•จ๋œ ์ธ๋ฑ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—… ์ด ํ•„์š” →ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ํฌํ•จ๋œ ์ธ๋ฑ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—… ์€ ๋žœ๋คํ•˜๊ฒŒ ๋””์Šคํฌ๋ฅผ ์ฝ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ๋‹ค๋ฉด ์ƒ๋‹นํžˆ ๋งŽ์€ ์ž์›์„ ์†Œ๋ชจ
  • ๐Ÿ˜ƒ ํ•ด๊ฒฐ : ์ธ๋ฑ์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์ฆ‰์‹œ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ž„์‹œ ๊ณต๊ฐ„์— ์ €์žฅํ•ด ๋‘๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ! → ์ด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ž„์‹œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ = ์ฒด์ธ์ง€ ๋ฒ„ํผ

ํŠน์ง•

  • ๋ฐ˜๋“œ์‹œ ์ค‘๋ณต ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ด์•ผ ํ•˜๋Š” ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค๋Š” ์ฒด์ธ์ง€ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
  • ์ฒด์ธ์ง€ ๋ฒ„ํผ์— ์ž„์‹œ๋กœ ์ €์žฅ๋œ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์กฐ๊ฐ์€ ์ดํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ๋ณ‘ํ•ฉ๋จ → ์ด๋ฅผ ์ฒด์ธ์ง€ ๋ฒ„ํผ ๋จธ์ง€ ์Šค๋ ˆ๋“œ ๋ผ๊ณ  ํ•จ

4.2.11 ๋ฆฌ๋‘(Redo) ๋กœ๊ทธ ๋ฐ ๋กœ๊ทธ ๋ฒ„ํผ

๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋žœ๋คํ•˜๊ฒŒ ๋””์Šคํฌ์— ๊ธฐ๋กํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋น„์šฉ์ด ๋น„์‹ผ ์ž‘์—…์ด๋‹ค. → ์ด ์ž‘์—…์„ ๋ชจ์•„์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒํ•˜๊ธฐ ์œ„ํ•ด InnoDB ๋ฒ„ํผ ํ’€ ๊ฐ™์€ ์žฅ์น˜๊ฐ€ ์žˆ์Œ

BUT! InnoDB ๋ฒ„ํผ ํ’€ ๋งŒ์œผ๋กœ๋Š” ACID๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†์–ด์„œ → ์ˆœ์ฐจ์ ์œผ๋กœ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜๋Š” ๋กœ๊ทธ ํŒŒ์ผ์„ ์ƒ์„ฑ = ๋ฆฌ๋‘ ๋กœ๊ทธ (์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ์ง€์นญํ•จ) ๋„ˆ๋ฌด ๋งŽ์€ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด ๋ฆฌ๋‘ ๋กœ๊ทธ์— ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ๋„ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์–ด์„œ ๋ณด์™„ํ•˜๊ณ ์ž = ๋กœ๊ทธ ๋ฒ„ํผ ๋กœ๊ทธ ๋ฒ„ํผ์˜ ํฌ๊ธฐ = ์ผ๋ฐ˜์ ์œผ๋กœ 1~8MB ์ˆ˜์ค€, BLOB๋‚˜ TEXT์™€ ๊ฐ™์ด ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์ฃผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋” ํฌ๊ฒŒ ์„ค์ •

4.2.12 ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‹œ ์ธ๋ฑ์Šค

  • InnoDB์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์ฃผ ์š”์ฒญํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ธ๋ฑ์Šค
  • innodb_adaptive_hash_index : ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ํ™œ์„ฑํ™” ๋ฐ ๋น„ํ™œ์„ฑํ™”

๋„์ž… ๋ชฉ์ 

  • B-Tree์˜ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์„ ์ค„์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด

์ž‘๋™ ๋ฐฉ์‹

  • ์ž์ฃผ ์ฝํžˆ๋Š” ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€์˜ ํ‚ค ๊ฐ’์„ ์ด์šฉํ•ด ๋ณ€์ˆ˜ ์ƒ์„ฑ
  • ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‹œ ์ธ๋ฑ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๋กœ ๊ฐ€๊ธฐ
  • → ์žฅ์ ! B-Tree๋ฅผ ๋ฃจํŠธ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฆฌํ”„ ๋…ธ๋“œ๊นŒ์ง€ ์ฐพ์•„๊ฐ€๋Š” ๋น„์šฉ์ด ์—†์–ด์ง€๊ณ , CPU๋Š” ์ ์€ ์ผ์„ ํ•˜์ง€๋งŒ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์€ ๋นจ๋ผ์ ธ์„œ ๋™์‹œ์— ๋” ๋งŽ์€ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•จ

ํŠน์ง•

  • (key, value) = (’์ธ๋ฑ์Šค ํ‚ค ๊ฐ’’, ํ•ด๋‹น ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์ด ์ €์žฅ๋œ ‘๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ์ฃผ์†Œ’)
  • ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’ = ‘B-Tree ์ธ๋ฑ์Šค ๊ณ ์œ ๋ฒˆํ˜ธ(ID)์™€ B-Tree ์ธ๋ฑ์Šค ์‹ค์ œ ํ‚ค ๊ฐ’’ ์กฐํ•ฉ
  • ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์— ‘B-Tree ์ธ๋ฑ์Šค์˜ ๊ณ ์œ ๋ฒˆํ˜ธ’๊ฐ€ ํฌํ•จ๋˜๋Š” ์ด์œ  → InnoDB์—์„œ ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‹œ ์ธ๋ฑ์Šค๋Š” ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ํŠน์ • ํ‚ค ๊ฐ’์ด ์–ด๋Š ์ธ๋ฑ์Šค์— ์†ํ•œ ๊ฒƒ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ!
RealMySQL 8.0 ์„ ์ฝ๊ณ  ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

4.1.1 ์ „์ฒด ๊ตฌ์กฐ

MySQL ์„œ๋ฒ„ = ์‚ฌ๋žŒ์˜ ๋จธ๋ฆฌ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” MySQL ์—”์ง„ + ์†๋ฐœ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„

MySQL ์—”์ง„

  1. ์ปค๋„ฅ์…˜ ํ•ธ๋“ค๋Ÿฌ : ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ปค๋„ฅ์…˜ ๋ฐ ์ฟผ๋ฆฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ
  2. SQL ์ธํ„ฐํŽ˜์ด์Šค : DML, DDL, Procedure, View ๋“ฑ SQL ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
  3. SQL ํŒŒ์„œ : SQL ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ํƒ์ง€ ๋ฐ SQL ์ฟผ๋ฆฌ ๋ฌธ์žฅ์„ MySQL์ด ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ข‹์€ ํ† ํฐ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ ์„œ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ํŒŒ์‹ฑํ•˜๋Š” ์ž‘์—… ๋‹ด๋‹น
  4. SQL ์˜ตํ‹ฐ๋งˆ์ด์ € : ์ฟผ๋ฆฌ์˜ ์ตœ์ ํ™”๋œ ์‹คํ–‰์„ ๋‹ด๋‹น
  5. ์บ์‹œ & ๋ฒ„ํผ : ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ณด์กฐ ์ €์žฅ์†Œ ๊ธฐ๋Šฅ ๋‹ด๋‹น

์Šคํ† ๋ฆฌ์ง€ ์—”์ง„

  • ํ•ธ๋“ค๋Ÿฌ API๋ฅผ ๋งŒ์กฑํ•˜๋ฉด ๋ˆ„๊ตฌ๋“ ์ง€ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ๊ตฌํ˜„ํ•˜์—ฌ MySQL์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋””์Šคํฌ ์Šคํ† ๋ฆฌ์ง€๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๋ถ€๋ถ„

๐Ÿ’ก MySQL ์—”์ง„์€ ํ•˜๋‚˜์ง€๋งŒ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

๋‹ค์Œ ์˜ˆ์ œ์™€ ๊ฐ™์ด ํ…Œ์ด๋ธ”์ด ์‚ฌ์šฉํ•  ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์ง€์ •ํ•˜๋ฉด ์ดํ›„ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ฝ๊ธฐ ์ž‘์—…์ด๋‚˜ ๋ณ€๊ฒฝ ์ž‘์—…์€ ์ •์˜๋œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ์ฒ˜๋ฆฌํ•œ๋‹ค.

mysql > CREATE TABLE test_table (fd1 IT, fd2 INT) ENGINE = INNODB;

ํ•ธ๋“ค๋Ÿฌ API

MySQL ์—”์ง„์˜ ์ฟผ๋ฆฌ ์‹คํ–‰๊ธฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ์ฝ์–ด์•ผ ํ•  ๋•Œ๋Š” ๊ฐ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—๊ฒŒ ์“ฐ๊ธฐ ๋˜๋Š” ์ฝ๊ธฐ๋ฅผ ์š”์ฒญํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ํ•ธ๋“ค๋Ÿฌ(Handler) ์š”์ฒญ์ด๋ผ๊ณ  ํ•˜๊ณ , ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋˜๋Š” API๋ฅผ ํ•ธ๋“ค๋Ÿฌ API๋ผ๊ณ  ํ•œ๋‹ค.

4.1.2 MySQL ์Šค๋ ˆ๋”ฉ ๊ตฌ์กฐ

MySQL์€ ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜์ด ์•„๋‹ˆ๋ผ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ํฌ๊ฒŒ ํฌ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ + ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ

ํฌ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ(ํด๋ผ์ด์–ธํŠธ ์Šค๋ ˆ๋“œ)

  • MySQL ์„œ๋ฒ„์— ์ ‘์†๋œ ํด๋ผ์ด์–ธํŠธ์˜ ์ˆ˜๋งŒํผ ์กด์žฌ
  • ์ฃผ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฌธ์žฅ์„ ์ฒ˜๋ฆฌ(๊ณ ๊ฐ ์ฐฝ๊ตฌ ์—ญํ• )
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—…์„ ๋งˆ์น˜๊ณ  ์ปค๋„ฅ์…˜์„ ์ข…๋ฃŒํ•˜๋ฉด, ํ•ด๋‹น ์ปค๋„ฅ์…˜์„ ๋‹ด๋‹นํ•˜๋˜ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์‹œ ์Šค๋ ˆ๋“œ ์บ์‹œ(Thread pool)๋กœ ๋˜๋Œ์•„๊ฐ„๋‹ค.
    • ์ด๋ฏธ ์Šค๋ ˆ๋“œ ์บ์‹œ์— ์ผ์ • ๊ฐœ์ˆ˜ ์ด์ƒ์˜ ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์Šค๋ ˆ๋“œ ์บ์‹œ์— ๋„ฃ์ง€ ์•Š๊ณ  ์Šค๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒ์‹œ์ผœ ์ผ์ • ๊ฐœ์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์Šค๋ ˆ๋“œ ์บ์‹œ์— ์กด์žฌํ•˜๊ฒŒ ํ•œ๋‹ค.
    • ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ = thread_cache_size

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ

  • Insert buffer ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ์Šค๋ ˆ๋“œ
  • ๋กœ๊ทธ๋ฅผ ๋””์Šคํฌ๋กœ ๊ธฐ๋กํ•˜๋Š” ์Šค๋ ˆ๋“œ
  • InnoDB ๋ฒ„ํผ ํ’€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜๋Š” ์Šค๋ ˆ๋“œ
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ๋กœ ์ฝ์–ด๋“ค์ด๋Š” ์Šค๋ ˆ๋“œ
  • ๊ทธ๋ฆฌ๊ณ  ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ž ๊ธˆ์ด๋‚˜ ๋ฐ๋“œ๋ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋Š” ์Šค๋ ˆ๋“œ
  • ๋ชจ๋“  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ **๋กœ๊ทธ ์Šค๋ ˆ๋“œ(Log thread)**์™€ ๋ฒ„ํผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ๋กœ ๋‚ด๋ ค์“ฐ๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์“ฐ๊ธฐ ์“ฐ๋ ˆ๋“œ

์ฝ๊ธฐ / ์“ฐ๊ธฐ ์“ฐ๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ = innodb_write_io_threads / nodb_read_io_threads

4.1.3 ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ์‚ฌ์šฉ๊ตฌ์กฐ

๊ธ€๋กœ๋ฒŒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

  • MySQL ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋˜๋ฉด์„œ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋œ๋‹ค.
  • ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋งŒ ํ• ๋‹น๋œ๋‹ค. ๋ชจ๋“  ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ๊ณต์œ ๋œ๋‹ค.

๋กœ์ปฌ(์„ธ์…˜) ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

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

4.1.4 ํ”Œ๋Ÿฌ๊ทธ์ธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ชจ๋ธ

MySQL์˜ ๋…ํŠนํ•œ ๊ตฌ์กฐ ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ๋ฐ”๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชจ๋ธ์ด๋‹ค!

  • ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐฉ์‹, ๊ฒ€์ƒ‰ ์—”์ง„, ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋“ฑ์„ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•ํƒœ๋กœ ๊ฐœ๋ฐœํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ธ๋“ค๋Ÿฌ API MySQL ์—”์ง„์˜ ์ฟผ๋ฆฌ ์‹คํ–‰๊ธฐ๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—๊ฒŒ CRUD ์ž‘์—…์„ ์œ„์ž„ํ•œ๋‹ค. → ์ด ๋•Œ, ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ์ œ๊ณตํ•˜๋Š” API = ํ•ธ๋“ค๋Ÿฌ API
  • ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชจ๋ธ ํ•ธ๋“ค๋Ÿฌ API ๊ทœ์น™์„ ๋งŒ์กฑํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋ฉด ๋ˆ„๊ตฌ๋“ ์ง€ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ๋งŒ๋“ค์–ด์„œ MySQL ์„œ๋ฒ„์— ์ถ”๊ฐ€ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ ์—”์ง„์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋ฉฐ, ๋งˆ์ง€๋ง‰์ธ “์ฝ๊ธฐ/์“ฐ๊ธฐ” ๋งŒ์ด ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.
    • GROUP BY, ORDER BY ๋“ฑ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋„ MySQL ์—”์ง„์—์„œ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ธฐ๋Šฅ์€ ์ž‘์•„๋ณด์ด๊ฒ ์ง€๋งŒ, ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค.
  • ์ฟผ๋ฆฌ ์ž‘์—…์€ ์—ฌ๋Ÿฌ ํ•˜์œ„ ์ž‘์—…์œผ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, ์ด ์ž‘์—…์—์„œ MySQL ์—”์ง„ ์˜์—ญ๊ณผ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์˜์—ญ์˜ ์ฐจ์ด๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

4.1.5 ์ปดํฌ๋„ŒํŠธ

  • MySQL 8.0 ์— ๊ธฐ์กด ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•จ
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•ด์„œ ๊ตฌํ˜„๋จ
  • INSTALL COMPONENT  ๋ฅผ ํ†ตํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ จ ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.
  • MySQL ์„œ๋ฒ„ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋‹จ์ 
    1. ์˜ค์ง MySQL ์„œ๋ฒ„์™€ ์ธํ„ฐํŽ˜์ด์Šค ํ•  ์ˆ˜ ์žˆ๊ณ , ํ”Œ๋Ÿฌ๊ทธ์ธ๋ผ๋ฆฌ ํ†ต์‹ ํ•  ์ˆ˜ ์—†๋‹ค.
    2. MySQL ์„œ๋ฒ„์˜ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. (์บก์Šํ™” ์•ˆ ํ•จ)
    3. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ƒํ˜ธ ์˜์กด ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์—†์–ด์„œ ์ดˆ๊ธฐํ™”๊ฐ€ ์–ด๋ ต๋‹ค.

4.1.6 ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ตฌ์กฐ

  • ์ฟผ๋ฆฌ ํŒŒ์„œ(Parser) : ์ฟผ๋ฆฌ ๋ฌธ์žฅ์— ๋Œ€ํ•ด์„œ ๋ฌธ๋ฒ•(Syntax) ํ™•์ธ์„ ํ•˜๊ณ  ์ฟผ๋ฆฌ ๋ฌธ์žฅ์„ ์ ์ ˆํ•œ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜์—ฌ ํŒŒ์„œ ํŠธ๋ฆฌ(parser tree)๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ์ „์ฒ˜๋ฆฌ๊ธฐ(Pre-processor) : ์•ž์—์„œ ๋งŒ๋“ค์–ด์ง„ ํŒŒ์„œ ํŠธ๋ฆฌ๋ฅผ ๋ณด๊ณ  ๊ตฌ์กฐ์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. (์˜ˆ๋ฅผ ๋“ค๋ฉด, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ…Œ์ด๋ธ”์ด๋‚˜ ์ปฌ๋Ÿผ ๋“ฑ์— ์ ‘๊ทผํ•œ๋‹ค๊ฑฐ๋‚˜ ์ ‘๊ทผํ•˜๋ ค๊ณ  ๋ณด๋‹ˆ ๊ถŒํ•œ์ด ์—†๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๋“ฑ)
  • ์˜ตํ‹ฐ๋งˆ์ด์ €(Optimizer) : ์š”์ฒญ๋ฐ›์€ ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์œผ๋กœ ๋น ๋ฅด๊ฒŒ → ์ฆ‰, ์ตœ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
    • ์•ž์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด์•ผํ•  ์ผ์€ ์ด ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๋” ๋‚˜์€ ๊ฒฐ์ •์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ = ์‹คํ–‰ ๊ณ„ํš ์ƒ์„ฑ
  • ์‹คํ–‰ ์—”์ง„ : ์˜ตํ‹ฐ๋งˆ์ด์ €์— ์˜ํ•ด ๊ฒฐ์ •๋œ ์‹คํ–‰ ๊ณ„ํš๋Œ€๋กœ ํ•ธ๋“ค๋Ÿฌ์—๊ฒŒ ์ง€์‹œํ•œ๋‹ค.
    • ex) ์ž„์‹œ ํ…Œ์ด๋ธ” ๋งŒ๋“ค์–ด → where ์กฐ๊ฑด๋Œ€๋กœ ๋ ˆ์ฝ”๋“œ ์ฝ์–ด์™€ → ์ฝ์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž„์‹œ ํ…Œ์ด๋ธ”์— ์จ๋ผ → …
  • ํ•ธ๋“ค๋Ÿฌ(์Šคํ† ๋ฆฌ์ง€ ์—”์ง„) : MySQL ์„œ๋ฒ„์˜ ๊ฐ€์žฅ ๋ฐ‘๋‹จ์—์„œ ์‹คํ–‰ ์—”์ง„์ด ๋‚ด๋ฆฐ ์ง€์‹œ๋Œ€๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

4.1.7 ๋ณต์ œ

  • ๋ณต์ œ(Replication) = 2๋Œ€ ์ด์ƒ์˜ MySQL ์„œ๋ฒ„๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋„๋ก ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ธฐ์ˆ 
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐˆ์ˆ˜๋ก ๋Œ€์šฉ๋Ÿ‰ํ™” ๋˜์–ด ๊ฐ€๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•˜๋ฉด ํ™•์žฅ์„ฑ(Scalability)๋Š” DBMS์—์„œ ์•„์ฃผ ์ค‘์š”ํ•œ ์š”์†Œ
  • MySQL์˜ ๋ณต์ œ๋Š” ๊ฑฐ์˜ 2000๋…„๋„๋ถ€ํ„ฐ ์ œ๊ณต๋๊ธฐ ๋•Œ๋ฌธ์— ํƒ€ DBMS์˜ ๋ณต์ œ๋ณด๋‹ค ํ›จ์”ฌ ์ด์ „๋ถ€ํ„ฐ ์ œ๊ณต๋œ ๊ธฐ๋Šฅ์ด๋ฉฐ ๋˜ํ•œ ๊ทธ๋งŒํผ ์•ˆ์ •์ 
  • ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„(INSERT/UPDATE ์ด์šฉ, Primary) + ์Šฌ๋ ˆ์ด๋ธŒ ์„œ๋ฒ„(SELECT๋งŒ ๊ฐ€๋Šฅ, Secondary)
    • ๋งˆ์Šคํ„ฐ๋Š” ๋ฐ˜๋“œ์‹œ 1๊ฐœ, ์Šฌ๋ ˆ์ด๋ธŒ๋Š” 1๊ฐœ ์ด์ƒ์ด์ง€๋งŒ ์„œ๋ฒ„ ํ•˜๋‚˜๋กœ ๋งˆ์Šคํ„ฐ์ด๋ฉด์„œ ์Šฌ๋ ˆ์ด๋ธŒ๋„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ
    • ๋‹จ์ง€ ์„œ๋ฒ„์˜ ์—ญํ•  ๋ชจ๋ธ์„ ์ง€์นญํ•˜๋Š” ๊ฒƒ์ผ๋ฟ!
    ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„
    1. ๋งˆ์Šคํ„ฐ์— ์“ฐ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์Šฌ๋ ˆ์ด๋ธŒ์— “๋ณต์ œ"ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•œ๋‹ค.
    2. ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„๋Š” ๋ณต์ œ๋ฅผ ์œ„ํ•ด์„œ MySQL ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์„œ ๋‚จ๊ฒจ์•ผ ํ•œ๋‹ค.
      1. ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์—๋Š” DML(๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฌธ์žฅ)๊ณผ DDL(์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฌธ์žฅ)์ด ๊ธฐ๋ก๋จ
    ์Šฌ๋ ˆ์ด๋ธŒ ์„œ๋ฒ„
    1. ์Šฌ๋ ˆ์ด๋ธŒ ์„œ๋ฒ„๋Š” **๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์— ์ ‘์†ํ•  ์ •๋ณด(IP, Port, ๊ณ„์ •)**๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋œ๋‹ค.
    2. ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„๋กœ ๋™๊ธฐํ™” ์š”์ฒญ์„ ํ•˜๊ณ  ๋ฐ›์•„์˜จ ๋‚ด์—ญ์„ ๋ฆด๋ ˆ์ด ๋กœ๊ทธ์— ๊ธฐ๋กํ•œ๋‹ค.
      1. ์ฐธ๊ณ ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์™€ ๋ฆด๋ ˆ์ด ๋กœ๊ทธ๋Š” ๋‚ด์šฉ์ด ๋™์ผํ•˜๋‹ค.
  • ๐Ÿšจ ๋ณต์ œ์‹œ ์ฃผ์˜์‚ฌํ•ญ
    1. ์Šฌ๋ ˆ์ด๋ธŒ๋Š” ํ•˜๋‚˜์˜ ๋งˆ์Šคํ„ฐ๋งŒ ์„ค์ • ๊ฐ€๋Šฅ
    2. ์Šฌ๋ ˆ์ด๋ธŒ๋Š” ํ•ญ์ƒ ์ฝ๊ธฐ ์ „์šฉ
    3. ๋งˆ์Šคํ„ฐ ์žฅ๋น„์™€ ์Šฌ๋ ˆ์ด๋ธŒ ์žฅ๋น„ ์‚ฌ์–‘์€ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉ
    4. ๋ณต์ œ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ์ค‘์ง€(๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ์ž‘์„ฑ์€ ๋น„์šฉ์ด ๊ต‰์žฅํžˆ ํฐ ์ž‘์—…)
    5. ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์™€ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(isolation level)
      1. ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ํŒŒ์ผ์€ ์–ด๋–ค ๋‚ด์šฉ์ด ๊ธฐ๋ก๋˜๋Š๋ƒ์— ๋”ฐ๋ผ STATEMENT ํฌ๋งท ๋ฐฉ์‹๊ณผ ROW ํฌ๋งท ๋ฐฉ์‹
      • STATEMENT ํฌ๋งท : ๋งˆ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ ๋ฌธ์žฅ ๊ธฐ๋ก
      • ROW ํฌ๋งท : ๋งˆ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋œ ์ฟผ๋ฆฌ์— ์˜ํ•ด ๋ณ€๊ฒฝ๋œ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ๊ธฐ๋ก

4.1.8 ์ฟผ๋ฆฌ ์บ์‹œ

  • ์ฟผ๋ฆฌ(SQL)๋ฅผ ์บ์‹œํ•˜์ง€ ์•Š๊ณ , ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œํ•œ๋‹ค.
  • ์ฟผ๋ฆฌ ์บ์‹œ๋Š” key, value ์Œ์˜ ๋งต(Map) ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค.
  • MySQL์—๋งŒ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ฉฐ, ์ƒ๊ฐ๋ณด๋‹ค ํšจ์œจ์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • ๐Ÿ”ฝ ์ฟผ๋ฆฌ ์บ์‹œ ํ™•์ธ ์ ˆ์ฐจ
    1. ์š”์ฒญ์œผ๋กœ ๋“ค์–ด์˜จ ๋ฌธ์žฅ์ด ์ฟผ๋ฆฌ ์บ์‹œ์— ์กด์žฌํ•˜๋Š”๊ฐ€? (๊ณต๋ฐฑ, ๋Œ€์†Œ๋ฌธ์ž ๋“ฑ ์™„๋ฒฝํ•˜๊ฒŒ ์ผ์น˜ํ•ด์•ผ)
    2. ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์€ ์ถฉ๋ถ„ํ•œ๊ฐ€?
    3. ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‹คํ–‰๋œ ์ฟผ๋ฆฌ๋ฉด, ๊ฒฐ๊ณผ๋„ ๊ฐ™์€ ๊ฐ€์‹œ ๋ฒ”์œ„ ๋‚ด์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฒฐ๊ณผ์ธ๊ฐ€?
      1. ๊ฐ€์‹œ ๋ฒ”์œ„ : ์ž์‹ ์˜ ํŠธ๋žœ์žญ์…˜ ์•„์ด๋””๋ณด๋‹ค ์ž‘์€ ๊ฒƒ(์ž์‹ ์˜ ํŠธ๋žœ์žญ์…˜๋ณด๋‹ค ์ด์ „์— ์‹คํ–‰๋œ ํŠธ๋žœ์žญ์…˜)๋งŒ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ์กฐ๊ฑด
    4. ์ฟผ๋ฆฌ์— ์‚ฌ์šฉ๋œ ๊ธฐ๋Šฅ์ด ์บ์‹œ๋ผ๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
    5. → CURRENT_DATE, SYSDATE, RAND ๊ฐ™์ด ํ˜ธ์ถœ ์‹œ์ ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€?, ๋ณ€์ˆ˜๊ฐ€ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€?
    6. ์บ์‹œ ์ƒ์„ฑ ํ›„ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋ณ€๊ฒฝ์ด ์žˆ์—ˆ๋Š”์ง€?
    7. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ๋„ˆ๋ฌด ํฐ ๋ฐ์ดํ„ฐ๋Š” ์•„๋‹Œ์ง€?
    8. ์ฟผ๋ฆฌ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€?
      1. ์บ์‹œํ•  ์ˆ˜ ์—†๋Š” ์š”์†Œ
      • ์ž„์‹œ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ
      • ์‚ฌ์šฉ์ž ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•œ ์ฟผ๋ฆฌ
      • ์ปฌ๋Ÿผ(column)๊ธฐ๋ฐ˜ ๊ถŒํ•œ ์„ค์ •
      • LOCK IN SHARE MODE ํžŒํŠธ
      • FOR UPDATE ํžŒํŠธ
      • User Defined Function ์‚ฌ์šฉ
      • ๋…๋ฆฝ์ ์ธ SELECT ๋ฌธ์ด ์•„๋‹Œ ์ผ๋ถ€๋ถ„์˜ ์„œ๋ธŒ ์ฟผ๋ฆฌ
      • Stored Procedure, Function, Trigger์—์„œ ์‚ฌ์šฉํ•œ ์ฟผ๋ฆฌ
      • SQL_NO_CACHE ํžŒํŠธ
    ๐Ÿง ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์บ์‹œ ํ™•์ธ ์ ˆ์ฐจ(์ด ๋ฐ–์—๋„ ๋” ์žˆ์Œ)๊ฐ€ ์žˆ๊ธฐ์— ์บ์‹œ ์ ์ค‘๋ฅ ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๊ณ , 
    ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ์บ์‹œ๋ฅผ ๋น„์šฐ๋Š”๋ฐ๋„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ฑธ๋ฆฌ๋ฏ€๋กœ 
    ์ „์ฒด์ ์œผ๋กœ ๋ณด์•˜์„ ๋•Œ ๊ณผ์—ฐ ํšจ์œจ์ ์ธ๊ฐ€์— ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์šฉ ํ™˜๊ฒฝ์„ ์ž˜ ๋”ฐ์ ธ๋ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค…
    

4.1.9 ์Šค๋ ˆ๋“œ ํ’€

์ผ์ •๋Ÿ‰์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋†“๊ณ , ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹ → why? ์š”์ฒญ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ค„์ด๊ณ ์ž!

  • ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ
    • ์Šค๋ ˆ๋“œ ์ƒ์„ฑ, ์ œ๊ฑฐ
    • context switching
    • ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง
  • Enterprise ๋ฒ„์ „ : ์Šค๋ ˆ๋“œ ํ’€ ์ œ๊ณต Community ๋ฒ„์ „ : ์ œ๊ณต X → Percona Server ์‚ฌ์šฉํ•˜๋ฉด ๋จ..

4.1.10 ํŠธ๋žœ์žญ์…˜ ์ง€์› ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ : DB ์„œ๋ฒ„์—์„œ ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ ์ •๋ณด, ์Šคํ† ์–ด๋“œ ํ”„๋กœ๊ทธ๋žจ ๋“ฑ์˜ ์ •๋ณด
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋“ค์„ InnoDB์— ์ €์žฅ

ํ™œ์šฉ ์˜ˆ์ œ

Counting

Strings

  • ๋‹จ์ˆœ ์ฆ๊ฐ ์—ฐ์‚ฐ
  • INCR / INCRBY / INCRBYFLOAT / HINCRBY / HINCRBYFLOAT / ZINCRBY

Bits

  • ๋ฐ์ดํ„ฐ ์ €์žฅ๊ณต๊ฐ„ ์ ˆ์•ฝ
  • ์ •์ˆ˜๋กœ ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์นด์šดํŒ… ๊ฐ€๋Šฅ
    • userid ๊ฐ’์ด 0 ์ด์ƒ์˜ ์ •์ˆ˜๊ฐ’์ผ ๋•Œ๋งŒ ์นด์šดํŒ…์ด ๊ฐ€๋Šฅ
    • ์‹œํ€€์…œํ•œ ๊ฐ’์ด ์—†์„ ๋•Œ์—๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • SETBIT / BITCOUNT

HyperLogLogs

  • ๋Œ€๋Ÿ‰์˜ ์œ ๋‹ˆํฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์นด์šดํŒ…ํ•  ๋•Œ ์ ์ ˆ
  • set๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ €์žฅ๋˜๋Š” ์šฉ๋Ÿ‰์ด ๋งค์šฐ ์ž‘์Œ
  • ์›น์‚ฌ์ดํŠธ์— ๋ฐฉ๋ฌธํ•œ ์œ ๋‹ˆํฌํ•œ IP ์ˆ˜ / ํ•˜๋ฃจ ์ข…์ผ ํฌ๋กค๋งํ•œ URL ์ˆ˜ / ๊ฒ€์ƒ‰์—”์ง„์—์„œ ๊ฒ€์ƒ‰๋œ ์œ ๋‹ˆํฌํ•œ ๋‹จ์–ด ์ˆ˜
  • PFADD / PFCOUNT / PFMERGE

Messaging

Lists

  • ์ž์ฒด์ ์œผ๋กœ blocking ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์„œ Event Queue๋กœ ์‚ฌ์šฉ → ๋ถˆํ•„์š”ํ•œ polling์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ
  • ํ‚ค๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ €์žฅ ๊ฐ€๋Šฅ - LPUSHX / RPUSHX

Streams

  • ๋กœ๊ทธ ์ €์žฅ
  • append-only
  • ์‹œ๊ฐ„ ๋ฒ”์œ„ ๊ฒ€์ƒ‰ / ์‹ ๊ทœ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  / ์†Œ๋น„์ž๋ณ„ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ (์†Œ๋น„์ž ๊ทธ๋ฃน) - kafka์—์„œ ์ฐจ์šฉ
  • ๋ฉ”์‹œ์ง• ๋ธŒ๋กœ์ปค ์—ญํ• 
  • XADD : hash์ฒ˜๋Ÿผ key-value ์Œ์œผ๋กœ ์ €์žฅ

 

์žฅ์•  ํฌ์ธํŠธ

Redis๋Š” Single Thread ๋ผ๋Š” ์ ์„ ์žŠ์ง€ ๋ง์ž!

  • keys * → scan์œผ๋กœ ๋Œ€์ฒด
  • ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ปค๋งจ๋“œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž
  • hash, sorted set ์“ธ ๋•Œ ํ•˜๋‚˜์˜ ํ‚ค์— 100๋งŒ๊ฐœ ์ดํ•˜๋กœ๋งŒ ๋‹ด์ž
  • Flush All : ํ‚ค ๋‹ค ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ธฐ → ์ด๊ฑฐ ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ๊ฑฐ ๋ชปํ•จ

Replication

  • replicaof ์ปค๋งจ๋“œ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณต์ œ ์—ฐ๊ฒฐ
  • ๋น„๋™๊ธฐ์‹ ๋ณต์ œ
  • Master๊ฐ€ ๋‹ค์šด๋˜๋”๋ผ๋„ Replica๊ฐ€ ์„œ๋น„์Šค๋ฅผ ๊ณ„์† ํ•  ์ˆ˜ ์žˆ์Œ
  • HA ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ ์žฅ์•  ์ƒํ™ฉ ์‹œ ์ˆ˜๋™ ๋ณต๊ตฌ
    • replicaof no one
    • ์„œ๋ฒ„ ๋‹ค์šด์‹œ AOF ๋˜๋Š” RDB๋กœ ์žฌ์‹œ์ž‘
  • replication ๊ณผ์ •์—์„œ fork๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ํŠน์ • ์ปค๋งจ๋“œ disable ํ•˜๊ธฐ

 

Sentinel

์„ผํ‹ฐ๋„์€ ์ผ๋ฐ˜ ๋…ธ๋“œ๋“ค์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง(monitoring)ํ•˜๋Š” ์—ญํ• 

์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„ ๊ฐ€๋Šฅํ•œ HA ๊ตฌ์„ฑ

  • ๋งˆ์Šคํ„ฐ๊ฐ€ ๋น„์ •์ƒ์ด๋ฉด ์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„(Automatic Failover)
  • ์—ฐ๊ฒฐ ์ •๋ณด ๋ณ€๊ฒฝ ํ•„์š” ์—†์Œ
  • ์„ผํ‹ฐ๋„ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ 3๋Œ€ ์ด์ƒ, ํ™€์ˆ˜๋กœ ์กด์žฌํ•ด์•ผ ํ•จ
    • ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ์„ผํ‹ฐ๋„์ด ๋™์˜ํ•ด์•ผ ํŽ˜์ผ์˜ค๋ฒ„ ์ง„ํ–‰
    • ์˜ˆ) ๋„คํŠธ์›Œํฌ์˜ ์ž ๊น์˜ ์˜ค๋ฒ„ํƒ€์ž„ ๋•Œ๋ฌธ์— ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ์ฃฝ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ•˜๋‚˜์˜ ์„ผํ‹ฐ๋„์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ์„ผํ‹ฐ๋„์ด "OK"ํ•ด์•ผ ๋น„๋กœ์†Œ ๊ทธ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋Š” ์ฃฝ์€ ๊ฒƒ์ด๊ณ , ๊ทธ๋•Œ Replica์—์„œ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋ฅผ ์„ ์ถœํ•œ๋‹ค.
  • ์•Œ๋ฆผ : ๊ฐ์‹œํ•˜๊ณ  ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ํŽ˜์ผ์˜ค๋ฒ„ ๋˜์—ˆ์„ ๋•Œ Pub/Sub์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํด๋ผ์ด์–ธํŠธ)์—๊ฒŒ ์•Œ๋ฆฌ๊ฑฐ๋‚˜ shell script๋กœ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ด๋ฉ”์ผ์ด๋‚˜ SMS์œผ๋กœ ์•Œ๋ฆผ ๊ฐ€๋Šฅ

 

Cluster

์Šค์ผ€์ผ ์•„์›ƒ๊ณผ HA ๊ตฌ์„ฑ

 

  • ํ‚ค๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ์ž๋™์œผ๋กœ ๋ถ„ํ• ํ•ด์„œ ์ €์žฅ (์ƒค๋”ฉ)
  • ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ๋ฅผ ๊ฐ์‹œํ•˜๋ฉฐ ๋งˆ์Šคํ„ฐ ๋น„์ •์ƒ ์ƒํƒœ์ผ ๋•Œ ์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„
  • ์ตœ์†Œ 3๋Œ€์˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ ํ•„์š”

 

์•„ํ‚คํ…์ฒ˜ ์„ ํƒ ๊ธฐ์ค€

+ Recent posts