MySQL ์•„ํ‚คํ…์ฒ˜


MySQL ์—”์ง„ ๊ด€๋ จ

๊ธฐ๋ณธ

  • ํ•ธ๋“ค๋Ÿฌ, ์—”์ง„, ์Šคํ† ๋ฆฌ์ง€์—”์ง„, ํ•˜๋“œ์›จ์–ด๋กœ ์ด๋ฃจ์–ด์ง
  • ์Šค๋ ˆ๋”ฉ: ํฌ์–ด๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ(ํด๋ผ์ด์–ธํŠธ ์Šค๋ ˆ๋“œ)์™€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ
    • MyISAM์€ ํด๋ผ์ด์–ธํŠธ์Šค๋ ˆ๋“œ๊ฐ€ ์“ฐ๊ธฐ ์ž‘์—…๊นŒ์ง€
  • ๋ฉ”๋ชจ๋ฆฌ: ๊ธ€๋กœ๋ฒŒ์˜์—ญ๊ณผ ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ
    • ๊ธ€๋กœ๋ฒŒ : ํ…Œ์ด๋ธ” ์บ์‹œ, ๋ฒ„ํผํ’€, ํ•ด์‹œ์ธ๋ฑ์Šค, ๋ฆฌ๋‘๋กœ๊ทธ ๋ฒ„ํผ
    • ๋กœ์ปฌ : ์ปค๋„ฅ์…˜, ์ •๋ ฌ๋ฒ„ํผ, ์กฐ์ธ ๋ฒ„ํผ

๊ฐ ํ•˜์œ„ ์ž‘์—…์ด MySQL ์—”์ง„ ์˜์—ญ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€, ์•„๋‹ˆ๋ฉด ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์˜์—ญ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ๊ตฌ๋ถ„ํ•  ์ค„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

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

SQL ์š”์ฒญ -> (MySQL ์—”์ง„์—์„œ) ์ฟผ๋ฆฌํŒŒ์„œ -> ์ „์ฒ˜๋ฆฌ๊ธฐ -> ์˜ตํ‹ฐ๋งˆ์ด์ €(์ฟผ๋ฆฌ ๋ณ€ํ™˜, ๋น„์šฉ ์ตœ์ ํ™”, ์‹คํ–‰ ๊ณ„ํš ์ˆ˜๋ฆฝ) -> ์ฟผ๋ฆฌ์‹คํ–‰๊ธฐ (์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ์‹คํ–‰)

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

์ด ์ฑ…์—์„œ๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์„ ํƒํ•˜๋Š” ๋‚ด์šฉ์„ ์„ค๋ช…ํ•  ๊ฒƒ์ด๋ฉฐ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๋” ๋‚˜์€ ์„ ํƒ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์œ ๋„ํ•˜๋Š”๊ฐ€๋ฅผ ์•Œ๋ ค์ค„ ๊ฒƒ์ด๋‹ค.

์‹คํ–‰ ์—”์ง„

๋งŒ๋“ค์–ด์ง„ ๊ณ„ํš๋Œ€๋กœ ๊ฐ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋ฐ›์€ ์š”์ฒญ์„ ๋‹ค๋ฅธ ํ•ธ๋“ค๋Ÿฌ ์š”์ฒญ์˜ ์ž…๋ ฅ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• 

๊ทธ ์™ธ

๊ฐ๊ฐ์˜ ์„ธ๋ถ€ ์ฃผ์ œ๋กœ ์žก๋Š”๊ฒŒ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌดํŠผ ์•„๋ž˜์™€ ๊ฐ™์€ ์ •๋ณด๋“ค์ด ์—”์ง„์—์„œ ์ง€์›ํ•œ๋‹ค.

  • ๋ณต์ œ
  • ์ฟผ๋ฆฌ ์บ์‹œ
  • ์Šค๋ ˆ๋“œ ํ’€
  • ํŠธ๋žœ์žญ์…˜ ์ง€์› ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

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

๊ฑฐ์˜ ์œ ์ผํ•˜๊ฒŒ ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ž ๊ธˆ์„ ์ œ๊ณตํ•œ๋‹ค.

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

  • ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค ๊ฐ’์˜ ์ˆœ์„œ๋Œ€๋กœ ๋””์Šคํฌ์— ์ €์žฅ๋จ
  • ๋ชจ๋“  ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค๋Š” ๋ ˆ์ฝ”๋“œ์˜ ์ฃผ์†Œ ๋Œ€์‹  ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค์˜ ๊ฐ’์„ ๋…ผ๋ฆฌ์ ์ธ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉ(MyISAM์—์„œ๋Š” ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ ์ฃผ์†Œ)

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

  • ์‹ค์ œ ์—”์ง„๋ ˆ๋ฒจ์—์„œ์˜ ์™ธ๋ž˜ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์ง€์›์„ ํ•จ

MVCC

์ผ๋ฐ˜์ ์œผ๋กœ ๋ ˆ์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ ํŠธ๋žœ์žญ์…˜์„ ์ง€์› ํ•˜๋Š” dbms๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ฉฐ, ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ผ๊ด€๋œ ์ฝ๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ๋ชฉ์ ์ด ์žˆ๋”ฐ.

  • ์–ธ๋‘๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ์ง€์›
  • multi version์ด๋ž€ ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฒ„์ „์ด ๋™์‹œ ๊ด€๋ฆฌ๋œ๋‹ค๋Š” ๊ฒƒ
  • ๊ตฌ๋ฌธ ์‹คํ–‰๊ณผ ๋™์‹œ์— (์ปค๋ฐ‹ ์—ฌ๋ถ€์™€ ๊ด€๋ จ ์—†์ด) innodb๋ฒ„ํผ ํ’€์— ๋ฐ˜์˜, ๋””์Šคํฌ์—๋Š” ๋ฐ˜์˜์—ฌ๋ถ€๊ฐ€ ํ™•์‹ค์น˜ ์•Š์Œ
  • ์ด ์‹œ์ ์—์„œ์˜ ์กฐํšŒ๋Š” ๊ฒฉ๋ฆฌ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ํฌ๊ฒŒ ์‚ดํŽด๋ณด๋ฉด
  • READ_UNCOMMITED : ๋ฒ„ํผ์—์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • READ_COMMITED ์ด์ƒ์˜ ๊ฒฉ๋ฆฌ ๋ ˆ๋ฒจ : ์ปค๋ฐ‹ ์ „์ด๋ฉด ์–ธ๋‘๋กœ๊ทธ์—์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ฆ‰ innodb๋ฒ„ํผํ’€-๋””์Šคํฌ, ์–ธ๋‘๋กœ๊ทธ๊นŒ์ง€ ๋ฉ€ํ‹ฐ๋ฒ„์ „์ด ์žˆ๋Š” ๊ฒƒ

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

  • ๊ฐ„๋‹จํ•˜๊ฒŒ ์š”์•ฝํ•˜๋ฉด ์ฝ๊ธฐ์— ๋Œ€ํ•œ ๋ฝ์„ ๊ฑธ์ง€ ์•Š๊ณ , ๊ฒฉ๋ฆฌ๋ ˆ๋ฒจ์„ค์ •์— ๋”ฐ๋ผ์„œ, ์ฝ๋Š” ์‹œ์ ์— ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๊ฐ

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

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

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

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ๊ฒฌ๊ณ ํ•œ ์žฅ์• ๋ณต๊ตฌ ์‹œ์Šคํ…œ์ด ์žˆ์Œ
  • innodb_force_recovery : ์žฅ์• ๊ฐ€ ๋‚˜์„œ ์‹œ์ž‘์ด ์•ˆ๋˜๋Š”๊ฒฝ์šฐ ์‚ฌ์šฉ
  • ์œ„์˜ ๋ณ€์ˆ˜ ์„ค์ •์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด, ๊ฐ€๋Šฅํ•œ ๋งŒํผ ๋คํ”„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•˜๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ๋กœ ํ…Œ์ด๋ธ” ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค.
    • 1=SRV_FORCE_IGNORE_CORRUPT : ์ธ๋ฑ์Šค๋‚˜ ํ…Œ์ด๋ธ”์˜ ์†์ƒ์„ ๋ฌด์‹œํ•˜๊ณ  ์‹œ์ž‘
    • 2=SRV_FORCE_NO_BACKUP : ๋ฉ”์ธ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„ ์‹œ์ž‘, ๋ฉ”์ธ์Šค๋ ˆ๋“œ๊ฐ€ ์–ธ๋‘๋ฐ์ดํ„ฐ ์‚ญ์ œํ•˜๋Š”๊ณผ์ •์—์„œ ์žฅ์• ๊ฐ€ ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด ์ด๊ฑฐ ์‚ฌ์šฉ
    • 3=SRV_FORCE_NO_TRX_UNDO : ์ปค๋ฐ‹๋˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ๋œ ํŠธ๋žœ์žญ์…˜์˜ ๋กค๋ฐฑ์„ ๋ง‰์Œ
    • 4=SRV_FORCE_NO_IBUF_MERGE : ์ธ์„œํŠธ ๋ฒ„ํผ์˜ ๋‚ด์šฉ ๋ฌด์‹œํ•˜๊ณ  ์‹œ์ž‘
    • 5=SRV_FORCE_NO_UNDO_LOG_SCAN : ์–ธ๋‘๋กœ๊ทธ๋ฅผ ์Šค์บ”ํ•˜์ง€ ์•Š๊ณ , ์žฅ์• ์‹œ์ ์˜ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•œ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘
    • 6=SRV_FORCE_NO_LOG_REDO : ๋งˆ์ง€๋ง‰ ์ฒดํฌํฌ์ธํŠธ๋กœ ์‹œ์ž‘

์ด๋ž˜๋„ ์•ˆ๋œ๋‹ค๋ฉด, db๋ฐฑ์—…๊ณผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ..

InnoDB ๋ฒ„ํผ ํ’€

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„, ๋””์Šคํฌ ๋ฐ์ดํ„ฐํŒŒ์ผ์ด๋‚˜ ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œํ•ด๋‘๋Š” ๊ณต๊ฐ„์ด๋‹ค. ์“ฐ๊ธฐ์ž‘์—…์„ ์ง€์—ฐ์‹œ์ผœ ์ผ๊ด„ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ฒ„ํผ ์—ญํ• ๋„ ๊ฐ™์ด ํ•œ๋‹ค.

๋ฒ„ํผ ํ’€์˜ ํฌ๊ธฐ ์„ค์ •

  • os์˜ 80ํผ์„ผํŠธ๋ฅผ ํ• ๋‹นํ•˜๋ผ๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ์€ ์ž˜๋ชป๋จ
  • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ๋ ˆ์ฝ”๋“œ ๋ฒ„ํผ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
  • 128mb์˜ ์ฒญํฌ๋ฅผ ๋‹จ์œ„๋กœ ์กฐ์ • ๊ฐ€๋Šฅ

๋ฒ„ํผ ํ’€์˜ ๊ตฌ์กฐ

๊ฑฐ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํŽ˜์ด์ง€ํฌ๊ธฐ๋กœ ์ชผ๊ฐœ์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ํฌ๊ฒŒ LRU ๋ฆฌ์ŠคํŠธ, Flush ๋ฆฌ์ŠคํŠธ, Free ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

  • LRU ๋ฆฌ์ŠคํŠธ
    • ์กฐ๊ธˆ ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š”, LRU์™€ MRU ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฒฐํ•ฉ๋œ ํ˜•ํƒœ
    • ๊ฐ๊ฐ New ์„œ๋ธŒ๋ฆฌ์ŠคํŠธ์™€(MRU), Old ์„œ๋ธŒ๋ฆฌ์ŠคํŠธ(LRU)๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
    • ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋Š” New ๋ฆฌ์ŠคํŠธ์˜ tail๊ณผ Old ๋ฆฌ์ŠคํŠธ์˜ head์˜ ์ ‘์ ์— ์‚ฝ์ž…๋œ๋‹ค.
    • ๋””์Šคํฌ ์ฝ๊ธฐ๋ฅผ ์ตœ์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค.
  • InnoDB์˜ ๋ฐ์ดํ„ฐ ์ฐพ๋Š” ๊ณผ์ •
    1. ํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ํŽ˜์ด์ง€๊ฐ€ ๋ฒ„ํผ ํ’€์— ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ. (InnoDB ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‹œ ์ธ๋ฑ์Šค๋กœ ํŽ˜์ด์ง€ ์ฐพ๊ธฐ, ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๋ฒ„ํผ ํ’€์—์„œ ํŽ˜์ด์ง€ ๊ฒ€์ƒ‰, ๋ฒ„ํผ ํ’€์—์„œ ์ด๋ฏธ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ํฌ์ธํ„ฐ๋ฅผ New์„œ๋ธŒ๋ฆฌ์ŠคํŠธ ๋ฐฉํ–ฅ์œผ๋กœ ์Šน๊ธ‰)
    2. ๋””์Šคํฌ์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐํŽ˜์ด์ง€๋ฅผ ๋ฒ„ํผ ํ’€์— ์ ์žฌ, ์ ์žฌํ•œ ์ดํ›„์— LRU ํ—ค๋“œ ๋ถ€๋ถ„์— ์ถ”๊ฐ€
    3. ๋ฒ„ํผ ํ’€์— ์ƒ์ฃผํ•˜๋Š” ํŽ˜์ด์ง€๋Š” ์ตœ๊ทผ ์ ‘๊ทผ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ age๊ฐ€ ๋ถ€์—ฌ๋จ
    4. ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ์ ‘๊ทผ๋๋‹ค๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ธ๋ฑ์Šค ํ‚ค๋ฅผ ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‹œ ์ธ๋ฑ์Šค์— ์ถ”๊ฐ€
    5. ์ฆ‰ ์ž์ฃผ ์‚ฌ์šฉ๋๋‹ค๋ฉด MRU์˜์—ญ์—์„œ ์˜ค๋ž˜ ์‚ด์•„๋‚จ๊ณ , ๋ฐ˜๋Œ€๋กœ๋Š” LRU๋์œผ๋กœ ๋ฐ€๋ ค๋‚˜์„œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋จ
  • flush ๋ฆฌ์ŠคํŠธ
    • ๋””์Šคํฌ๋กœ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€์˜ ๋ณ€๊ฒฝ ์‹œ์  ๊ธฐ์ค€์˜ ํŽ˜์ด์ง€ ๋ชฉ๋ก์„ ๊ด€๋ฆฌ.
    • ์ฝ์€ ์ƒํƒœ์—์„œ ์ˆ˜์ •์ด ์žˆ๋‹ค๋ฉด ํ”Œ๋Ÿฌ์‹œ ๋ฆฌ์ŠคํŠธ์— ์˜ค๋ฅด๊ณ , ๊ด€๋ฆฌ๋˜๋‹ค๊ฐ€ ๋””์Šคํฌ์— ๊ธฐ๋ก๋จ
    • ๋ณ€๊ฒฝ์ด ๋˜์–ด ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ ๋˜๋ฉด ์•„๊นŒ ๋ณธ ๋ฆฌ๋‘ ๋กœ๊ทธ์— ๊ธฐ๋กํ•˜๋Š” (๋ณ€๊ฒฝ์„) ๊ณผ์ •์ด ์ผ์–ด๋‚จ.
    • ๋ฆฌ๋‘ ๋กœ๊ทธ๊ฐ€ ๋””์Šคํฌ๋กœ ๊ธฐ๋ก๋๋‹ค๊ณ  ํ•ด์„œ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๊ฐ€ ๋””์Šคํฌ๋กœ ๊ธฐ๋ก๋๋‹ค๋Š”๊ฒƒ์„ ํ•ญ์ƒ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Œ
  • free ๋ฆฌ์ŠคํŠธ
    • ์‹ค์ œ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์›Œ์ง€์ง€ ์•Š๋Š” ์—ฌ์œ ๊ณต๊ฐ„
    • ์‚ฌ์šฉ์ž์˜ ์ฟผ๋ฆฌ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ๋””์Šคํฌ์˜ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด์™€์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๋จ

๋ฒ„ํผ ํ’€๊ณผ ๋ฆฌ๋‘ ๋กœ๊ทธ

  • ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋””์Šคํฌ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด, ๋ฒ„ํผํ’€์„ ๋Š˜๋ฆฌ๋ฉด ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์€ ๋นจ๋ผ์ง
  • ๊ทผ๋ณธ์ ์œผ๋กœ ๋”ฐ์ ธ๋ณด๋ฉด InnoDB ๋ฒ„ํผ ํ’€์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋‘๊ฐ€์ง€ ๊ด€์ ์œผ๋กœ ์ ‘๊ทผํ•จ ๋ฐ์ดํ„ฐ ์บ์‹œ, ๋ฒ„ํผ๋ง
  • ๋ฒ„ํผํ’€ ๋Š˜๋ฆฌ๋Š”๊ฑด ์ „์ž์— ๊ด€์—ฌ
  • ๋ฒ„ํผ๋ง์„ ๋Š˜๋ฆฌ๋ ค๋ฉด ๋ฒ„ํผํ’€๊ณผ ๋ฆฌ๋‘ ๋กœ๊ทธ์˜ ๊ด€๊ณ„๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
    • ๋ฒ„ํผํ’€์€ ํด๋ฆฐํŽ˜์ด์ง€์™€ ๋”ํ‹ฐํŽ˜์ด์ง€(๋””์Šคํฌ์—์„œ ์ฝ์–ด์˜จ ์ดํ›„ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•œ ํŽ˜์ด์ง€) ๋ชจ๋‘๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    • ๋ฆฌ๋‘ ๋กœ๊ทธ๋Š” 1๊ฐœ ์ด์ƒ์˜ ๊ณ ์ • ํฌ๊ธฐ ํŒŒ์ผ์„ ์—ฐ๊ฒฐํ•ด์„œ ์ˆœํ™˜ ๊ณ ๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉ
    • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๊ณ„์† ๋ฐœ์ƒํ•˜๋ฉด ๋ฆฌ๋‘ ๋กœ๊ทธํŒŒ์ผ์— ๊ธฐ๋ก๋๋˜ ๋กœ๊ทธ ์—”ํŠธ๋ฆฌ๋Š” ์–ด๋А ์ˆœ๊ฐ„ ๋‹ค์‹œ ์ƒˆ๋กœ์šด ๋กœ๊ทธ ์—”ํŠธ๋ฆฌ๋กœ ๋ฎ์–ด์”Œ์›Œ์ง
    • ๊ทธ๋ž˜์„œ ๋ฆฌ๋‘ ๋กœ๊ทธํŒŒ์ผ์—์„œ ์žฌ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„๊ณผ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์„ ๊ตฌ๋ถ„ํ•ด์„œ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š”๋ฐ, ๋ถˆ๊ฐ€๋Šฅํ•œ๊ณต๊ฐ„์„ ํ™œ์„ฑ ๋ฆฌ๋‘ ๋กœ๊ทธ๋ผ๊ณ  ํ•œ๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ๋‘ ๋กœ๊ทธ ํŒŒ์ผ์€ ์ˆœํ™˜๋˜์–ด ์žฌ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ๋งค ๊ธฐ๋ก์‹œ๋งˆ๋‹ค ๋กœ๊ทธํฌ์ง€์…˜์ด ์ฆ๊ฐ€ ์ด๊ฒƒ์„ LSN์ด๋ผ๊ณ  ํ•œ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฒดํฌํฌ์ธํŠธ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๋ฆฌ๋‘ ๋กœ๊ทธ์™€ ๋ฒ„ํผํ’€์˜ ๋”ํ‹ฐํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š”๋ฐ
    • ๋ฐœ์ƒํ•œ ์ฒดํฌํฌ์ธํŠธ ์ค‘ ๊ฐ€์žฅ ์ตœ๊ทผ ์ฒดํฌํฌ์ธํŠธ ์ง€์ ์˜ LSN์ด ํ™œ์„ฑ ๋ฆฌ๋‘ ๋กœ๊ทธ ๊ณต๊ฐ„์˜ ์‹œ์ž‘์ 
    • ํ•˜์ง€๋งŒ ํ™œ์„ฑ ๋ฆฌ๋‘ ๋กœ๊ทธ ๊ณต๊ฐ„์˜ ๋งˆ์ง€๋ง‰์€ ๊ณ„์†ํ•ด์„œ ์ฆ๊ฐ€ํ•˜๊ธฐ์— ์ฒดํฌํฌ์ธํŠธ์™€ ๋ฌด๊ด€
    • ๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ์ตœ๊ทผ ์ฒดํฌํฌ์ธํŠธ์˜ lsn๊ณผ ๋งˆ์ง€๋ง‰ ๋ฆฌ๋‘ ๋กœ๊ทธ ์—”ํŠธ๋ฆฌ์˜ lsn์˜ ์ฐจ์ด๋ฅผ ์ฒดํฌํฌ์ธํŠธ์—์ด์ง€๋ผ๊ณ  ํ•จ
    • ๊ฒฐ๋ก ์ ์œผ๋กœ ๋ฆฌ๋‘ ๋กœ๊ทธ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ ๋‹ค๋ฉด ๋„ˆ๋ฌด ์ ์€ ๋”ํ‹ฐ ํŽ˜์ด์ง€์˜ ์ œํ•œ๋•Œ๋ฌธ์— ์“ฐ๊ธฐ๊ฐ€ ์ž์ฃผ์ผ์–ด๋‚˜๊ฒŒ ๋˜๊ณ , ์ด๋Ÿฌ๋ฉด ๋ฒ„ํผํ’€์˜ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋†’์•„๋ด์•ผ ์“ฐ๊ธฐ ๋ฒ„ํผ๋ง์˜ ํšจ๊ณผ๋Š” ์ „ํ˜€ ์—†๋‹ค.
    • ๋ฐ˜๋Œ€๋กœ ๋ฆฌ๋‘ ๋กœ๊ทธ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ „์ฒด ๋ฒ„ํผํ’€์— ๋น„ํ•ด ํ„ฐ๋ฌด๋‹ˆ ์—†์ด ๋†’๋‹ค๋ฉด ๋‹จ ํ•œ ์ˆœ๊ฐ„์— ๋„ˆ๋ฌด ํฐ ๋””์Šคํฌ ์“ฐ๊ธฐ๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

๋ฒ„ํผ ํ’€ ํ”Œ๋Ÿฌ์‹œ

  • ๋”ํ‹ฐํŽ˜์ด์ง€๋“ค์˜ ๋””์Šคํฌ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘๊ฐ€์ง€์˜ ๊ธฐ๋Šฅ์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๋‹ค.
  • ํ”Œ๋Ÿฌ์‹œ ๋ฆฌ์ŠคํŠธ ํ”Œ๋Ÿฌ์‹œ
    • ๋ฆฌ๋‘ ๋กœ๊ทธ ๊ณต๊ฐ„์˜ ์žฌํ™œ์šฉ์„ ์œ„ํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์˜ค๋ž˜๋œ ๋ฆฌ๋‘ ๋กœ๊ทธ ์—”ํŠธ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ณต๊ฐ„์„ ๋น„์›Œ์•ผํ•œ๋‹ค.
    • ๊ทธ๋Ÿฌ๋ ค๋ฉด ๋‹น์—ฐํžˆ ๋”ํ‹ฐํŽ˜์ด์ง€๊ฐ€ ๋จผ์ € ๋””์Šคํฌ๋กœ ๋™๊ธฐํ™” ๋ผ์•ผ ํ•œ๋‹ค.
    • ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ flush list flush ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • innodb_page_cleaners : ๋”ํ‹ฐํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” ํด๋ฆฌ๋„ˆ ์Šค๋ ˆ๋“œ์˜ ๊ฐฏ์ˆ˜
    • innodb_buffer_pool_instances : ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฒ„ํผํ’€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ทธ ๊ฐฏ์ˆ˜ ์—ฌ๊ธฐ์„œ ์–ธ๊ธ‰๋œ ๊ฒƒ์€ ํด๋ฆฌ๋„ˆ ์Šค๋ ˆ๋“œ์™€ ๊ฐฏ์ˆ˜๋ฅผ ์ž๋™์ ์œผ๋กœ ๋งž์ถฐ์ฃผ๋Š”๊ฒŒ ๋””ํดํŠธ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ ๊ตณ์ด ๋ณ€๊ฒฝํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค๋Š” ์–ธ๊ธ‰๊ณผ ํ•จ๊ป˜
    • innodb_max_dirty_pages_pct : ๋ฒ„ํผํ’€์—์„œ ๋”ํ‹ฐํŽ˜์ด์ง€๊ฐ€ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„์œจ
    • innodb_max_dirty_pages_lwm : ์“ฐ๊ธฐ ํญ๋ฐœ (Disk IO Burst)์„ ๋Œ€๋น„ํ•˜์—ฌ ํŠน์ • ๋น„์œจ ์ด์ƒ์ธ๊ฒฝ์šฐ ์ฃผ๊ธฐ์ ์œผ๋กœ ์“ฐ๊ธฐ๋ฅผ ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ํผ์„ผํ…Œ์ด์ง€
    • ๊ทธ์™ธ์—๋„ capacity์™€ ๊ฐ™์€ ๊ฐ’๋“ค์ด ์žˆ๋Š”๋ฐ, ์‚ฌ์‹ค ์—ฌ๊ธฐ ๋‚˜๋จธ์ง€ ์„ธ์„ธํ•œ ์„ค์ •๋“ค์€ hdd๋ฅผ ์“ฐ๋˜ ์‹œ์ ˆ ์น˜๋ช…์ ์ด๋˜ disk io๋ฅผ ์ค„์ด๋ ค๊ณ  ํ•œ ๋…ธ๋ ฅ์— ๋” ๊ฐ€๊นŒ์›Œ์„œ ์ •๋ง ์˜ˆ๋ฏผํ•˜์ง€ ์•Š์œผ๋ฉด ์•ˆ ๊ฑด๋“ค์–ด๋„ ๋ ๊ฒƒ ๊ฐ™๋‹ค.
  • LRU ๋ฆฌ์ŠคํŠธ ํ”Œ๋Ÿฌ์‹œ
    • ํ”„๋ฆฌํŽ˜์ด์ง€๋กœ ์˜ฎ๊ธด๋‹ค, ์ •๋„ ์ œ์™ธํ•˜๊ณค ํฐ ์ฐจ์ด ์—†๋‹ค.

๋ฒ„ํผ ํ’€ ์ƒํƒœ ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ

  • ์ž˜ ๋ฉ”๋ชจ๋ฆฌ ์ฆ‰ ๋ฒ„ํผํ’€์— ์˜ฌ๋ผ๊ฐ„์ƒํƒœ(warmed up)์˜ ์ฟผ๋ฆฌ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋Œ€๋น„ ์ˆ˜์‹ญ๋ฐฐ ๋น ๋ฆ„
  • ์˜ˆ์ „์—๋Š” ์ด๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๊ฐ€ ์ž˜ ์•ˆ๋˜์–ด ์„œ๋น„์Šค์ „ ํ’€ํ…Œ์ด๋ธ” ์Šค์บ”์„ ์œ ๋ฐœ์‹œ์ผœ์„œ ์›Œ๋ฐ์—…์„ ๋งค๋‰ด์–ผํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ์Œ
  • ์ง€๊ธˆ์€ ๊ทธ๋Ÿด ํ•„์š” ์—†์ด ๋ฒ„ํผ ํ’€ ๋คํ”„๋ฅผ ํ†ตํ•ด์„œ ์žฌ์‹คํ–‰๋˜์–ด๋„ ๋ฒ„ํผ๊ฐ€ ์ฑ„์›Œ์ ธ ์žˆ๋„๋ก ๊ด€๋ฆฌ

๋ฒ„ํผ ํ’€์˜ ์ ์žฌ ๋‚ด์šฉ ํ™•์ธ

  • information schema -> innodb_buffer_page ํ…Œ์ด๋ธ”์—์„œ ๋ฒ„ํผํ’€ ํ™•์ธ๊ฐ€๋Šฅ
select
	it.name table_name,
	ii.name index_name,
	ici.n_cached_pages n_cached_pages
from information_schema.innodb_tables it
	inner join information_schema.innodb_indexes ii on ii.table_id = it.table_id
	inner join information_schema.innodb_cached_indexes ici on ici.index_id = ii.index_id
where it.name=concat('employees','/','employess')
;

์–ธ๋‘ ๋กœ๊ทธ

  • ์ฃผ ์‚ฌ์šฉ์ฒ˜๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํŠธ๋žœ์žญ์…˜๋ณด์žฅ๊ณผ ๊ฒฉ๋ฆฌ์ˆ˜์ค€ ๋ณด์žฅ
  • ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ์ ์— ์ž‘์„ฑ๋œ๋‹ค.(ํŠธ๋žœ์žญ์…˜์„ ์œ„ํ•ด)

์–ธ๋‘ ๋กœ๊ทธ ๋ ˆ์ฝ”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง

  • ์ผ๋‹จ ๊ด€๋ฆฌ์— ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค. 1์–ต๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ ๋ฆฌ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” dml์ด๋ฉด?
  • ๊ทธ๋ฆฌ๊ณ  ํŠธ๋žœ์žญ์…˜์˜ ๊ด€๋ฆฌ๊ฐ€ ์•ˆ๋œ๋‹ค๋ฉด, ์–ธ๋‘๋กœ๊ทธ๊ฐ€ ๋‹ค๋ฅธํŠธ๋žœ์žญ์…˜์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์–ธ๋‘๋กœ๊ทธ๊ฐ€ ์‚ญ์ œ๊ฐ€ ์•ˆ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ B์™€ C๊ฐ€ dml ํŠธ๋žœ์žญ์…˜์„ ๋‚ ๋ฆฐ๋‹ค๋ฉด, b์™€ c์˜ Undo ๋กœ๊ทธ๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Œ.
  • ์ด์œ ๋Š” ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ์—ฌ์ „ํžˆ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ.
  • 8.0 ์ดํ›„ ์–ธ๋‘๋กœ๊ทธ๊ฐ€ ๊ฐœ์„ ๋˜์–ด ์–ธ๋‘๋กœ๊ทธ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ค„์ด๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•ด์กŒ์Œ
  • ์ฐธ๊ณ ๋กœ ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค ์ธ ๋งŒํผ ์ด๋…ธ๋””๋น„ ๋ฒ„ํผํ’€์— ์˜ฌ๋ผ๊ฐ€๊ธฐ๋„ ํ•˜์ง€๋งŒ ๋กœ๊ทธ์ž์ฒด๋Š” ๋””์Šคํฌ

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

  • ์ฒด์ธ์ง€ ๋ฒ„ํผ๋Š” ์ธ๋ฑ์Šค ํŽ˜์ด์ง€์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋””์Šคํฌ๊ฐ€ ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ์— ์ž„์‹œ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„ ย 
  • InnoDB ๋ฒ„ํผ ํ’€(Buffer Pool)์˜ ์ผ๋ถ€๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ ๋ณด์กฐ ์ธ๋ฑ์Šค(Secondary Index) ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅ ย 
  • ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๋ฅผ ์ฆ‰์‹œ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ˆ„์ ํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ย 
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋  ๋•Œ ๋””์Šคํฌ์™€ ๋™๊ธฐํ™”(merge)๋˜๋ฉฐ, ์ผ์ • ์ฃผ๊ธฐ๋งˆ๋‹ค ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ‘ํ•ฉ ย 
  • ๋™์ž‘ ์˜ˆ์‹œ
    1. ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์กฐ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ DML(INSERT, DELETE, UPDATE)์„ ์‹คํ–‰ ย 
    2. ๋ณ€๊ฒฝ๋œ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€๊ฐ€ ๋ฒ„ํผ ํ’€์— ์—†๋‹ค๋ฉด, ์ฒด์ธ์ง€ ๋ฒ„ํผ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋ก ย 
    3. ์ดํ›„ ํ•ด๋‹น ์ธ๋ฑ์Šค ํŽ˜์ด์ง€๊ฐ€ ์กฐํšŒ๋˜๋ฉด ์ฒด์ธ์ง€ ๋ฒ„ํผ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉ(merge) ย 
    4. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ๋””์Šคํฌ์— ๋ฐ˜์˜ ย 
  • innodb_change_buffer_max_size ์„ค์ •์„ ํ†ตํ•ด ํฌ๊ธฐ ์กฐ์ ˆ ๊ฐ€๋Šฅ ย 
  • ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜๋ฉด ์ฒด์ธ์ง€ ๋ฒ„ํผ๋„ ๋กค๋ฐฑ๋จ ย 
  • ๊ธฐ๋ณธ ํ‚ค(Primary Key)์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ณด์กฐ ์ธ๋ฑ์Šค์—๋งŒ ์‚ฌ์šฉ ย 
  • ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๋ณด์กฐ ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์€ ํ…Œ์ด๋ธ”์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํšจ๊ณผ๊ฐ€ ํผ

๋ฆฌ๋‘ ๋กœ๊ทธ

  • ๋ฆฌ๋‘ ๋กœ๊ทธ๋Š” ํŠธ๋žœ์žญ์…˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋””์Šคํฌ์— ์˜๊ตฌ ๋ฐ˜์˜ํ•˜๊ธฐ ์ „์— ๋กœ๊ทธ๋กœ ๊ธฐ๋กํ•˜๋Š” ๊ตฌ์กฐ

  • ์‹œ์Šคํ…œ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ฆฌ๋‘ ๋กœ๊ทธ๋ฅผ ์ด์šฉํ•ด ๋ฏธ์™„๋ฃŒ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Œ

  • InnoDB๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋จผ์ € ๋กœ๊ทธ ํŒŒ์ผ์— ๊ธฐ๋กํ•œ ํ›„ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€์— ๋ฐ˜์˜

  • ๋ฆฌ๋‘ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด MySQL์ด ACID ํŠน์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, COMMIT๋œ ๋ฐ์ดํ„ฐ์˜ ์˜์†์„ฑ์„ ์œ ์ง€

  • ์‚ฌ์šฉ์ž๊ฐ€ DML(INSERT, UPDATE, DELETE)์„ ์‹คํ–‰ํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ InnoDB ๋ฒ„ํผ ํ’€์— ๋ฐ˜์˜๋จ

  • ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์ด ๋ฆฌ๋‘ ๋กœ๊ทธ ๋ฒ„ํผ์— ๊ธฐ๋ก๋œ ํ›„, ์ผ์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๊ฑฐ๋‚˜ COMMIT ๋ฐœ์ƒ ์‹œ ๋ฆฌ๋‘ ๋กœ๊ทธ ๋ฒ„ํผ์˜ ๋‚ด์šฉ์„ ๋””์Šคํฌ์— ์ˆœ์ฐจ์ ์œผ๋กœ ๊ธฐ๋ก

  • ์ดํ›„ InnoDB์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”Œ๋Ÿฌ์‹œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋กœ ๋ฐ˜์˜

  • ์‹œ์Šคํ…œ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ฆฌ๋‘ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณต๊ตฌ

  • ๋ฆฌ๋‘ ๋กœ๊ทธ ํŒŒ์ผ์€ ib_logfile0, ib_logfile1 ๋“ฑ์˜ ํŒŒ์ผ๋กœ ์ €์žฅ๋˜๋ฉฐ ์ˆœํ™˜ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

  • ํŠน์ • ํฌ๊ธฐ์— ๋„๋‹ฌํ•˜๋ฉด ๋ฎ์–ด์“ฐ๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์žฌ์‚ฌ์šฉ

  • innodb_log_files_in_group ์„ค์ •์„ ํ†ตํ•ด ๋‹ค์ค‘ ๋กœ๊ทธ ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ

  • innodb_log_file_size๋Š” ๊ฐ ๋ฆฌ๋‘ ๋กœ๊ทธ ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋ฉฐ, ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด ์ฒดํฌํฌ์ธํŠธ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ

  • ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ๋ณต๊ตฌ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Œ

  • innodb_flush_log_at_trx_commit ๊ฐ’์— ๋”ฐ๋ผ ๋ฆฌ๋‘ ๋กœ๊ทธ์˜ ๋””์Šคํฌ ๋ฐ˜์˜ ์‹œ์ ์ด ์กฐ์ •๋จ

  • 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด 1์ดˆ๋งˆ๋‹ค ๋ฆฌ๋‘ ๋กœ๊ทธ๋ฅผ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜์—ฌ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์ง€๋งŒ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋  ์ˆ˜ ์žˆ์Œ

  • 1์€ ๋งค ํŠธ๋žœ์žญ์…˜ COMMIT ์‹œ ๋ฆฌ๋‘ ๋กœ๊ทธ๋ฅผ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜์—ฌ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•จ

  • 2๋Š” ๋งค COMMIT ์‹œ OS ๋ฒ„ํผ์— ๊ธฐ๋กํ•˜๊ณ , 1์ดˆ๋งˆ๋‹ค ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์˜ ๊ท ํ˜•์„ ๋งž์ถค

  • WAL ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ๋จผ์ € ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜์—ฌ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ

  • ๋กœ๊ทธ ๋ฒ„ํผ๋Š” ๋ฆฌ๋‘ ๋กœ๊ทธ๊ฐ€ ๋จผ์ € ์ €์žฅ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์œผ๋กœ ์ดํ›„ ๋””์Šคํฌ๋กœ ํ”Œ๋Ÿฌ์‹œ๋จ

  • ์ฒดํฌํฌ์ธํŠธ๋Š” ๋ฆฌ๋‘ ๋กœ๊ทธ ํฌ๊ธฐ ์ดˆ๊ณผ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ์‹œ์ ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์— ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ •

  • ๋ฆฌ๋‘ ๋กœ๊ทธ ํŒŒ์ผ์€ ์ˆœํ™˜ ๊ตฌ์กฐ์ด๋ฏ€๋กœ ์‚ฌ์šฉ๋œ ๋กœ๊ทธ๋Š” ์ฒดํฌํฌ์ธํŠธ ์ดํ›„ ๋ฎ์–ด์“ฐ๊ธฐ๋จ

  • ํŠธ๋žœ์žญ์…˜ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋น ๋ฅธ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ

  • ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ๋ณ€๊ฒฝ์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋จ

  • ์ˆœ์ฐจ์ ์ธ ๋กœ๊ทธ ์“ฐ๊ธฐ๋กœ ์ธํ•ด ๋””์Šคํฌ I/O ๋ถ€ํ•˜๊ฐ€ ๊ฐ์†Œํ•จ

  • ๋ฆฌ๋‘ ๋กœ๊ทธ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ง€์—ฐ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ ์ ˆํ•œ ํฌ๊ธฐ ์„ค์ •์ด ํ•„์š”ํ•จ

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

  • ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํŽ˜์ด์ง€์— innodb์—”์ง„์ด ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ์ธ๋ฑ์Šค
  • b+ ํŠธ๋ฆฌ๋Š” ์ข…๋‹จ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€์•ผ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ ์ด๊ฑธ ๊ทธ๋ƒฅ ํ•ด์‰ฌ๋กœ ์ตœ์ ํ™”์‹œํ‚ด
  • ํ•ด์‰ฌ๊ฐ’์˜ ํ‚ค๋กœ๋Š” ์ธ๋ฑ์Šค ๊ณ ์œ ๊ฐ’ + ์ธ๋ฑ์Šค ์‹ค์ œ ํ‚ค๊ฐ’ ์„ ์”€
  • ์˜ˆ์ „ ๋ฒ„์ „๊นŒ์ง€๋Š” ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‰ฌ ์ธ๋ฑ์Šค๋Š” ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด์ธ ์ด์œ ๋กœ ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‹œ ์ธ๋ฑ์Šค์˜ ๊ฒฝํ•ฉ์ด ์‹ฌํ–ˆ๋‹ค ๊ทธ๋ž˜์„œ 8.0๋ถ€ํ„ฐ๋Š” ๋‚ด๋ถ€ ์ž ๊ธˆ ๊ฒฝํ•ฉ์„ ์ค„์ด๊ธฐ์œ„ํ•ด ์–ด๋Œ‘ํ‹ฐ๋ธŒ ํ•ด์‰ฌ ์ธ๋ฑ์Šค์˜ ํŒŒํ‹ฐ์…˜๊ธฐ๋Šฅ์„์ œ๊ณตํ•œ๋‹ค (๋Œ€์ถฉ ์ด๊ฒƒ๋„ ํ•˜๋‚˜๋ผ ๊ฒฝํ•ฉ์ด ์‹ฌํ–ˆ๋Š”๋ฐ ํŒŒํ‹ฐ์…˜์„ ํ•ด์ค€๋‹ค๋Š” ์ด์•ผ๊ธฐ)
  • ๋„์›€ ์ž˜๋˜๋Š” ๊ฒฝ์šฐ
    • ๋””์Šคํฌ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฒ„ํผํ’€์ด๋ž‘ ๋น„์Šทํ•œ๊ฒฝ์šฐ
    • ๋™๋“ฑ์กฐ๊ฑด ๊ฒ€์ƒ‰๋™๋“ฑ๋น„๊ต์™€ in์—ฐ์‚ฐ ๋งŽ์€๊ฒฝ์šฐ
    • ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ์ค‘์—์„œ ์ผ๋ถ€๋ฐ์ดํ„ฐ์— ์ง‘์ค‘๋˜๋Š”๊ฒฝ์šฐ
  • ๋„์›€ ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ
    • ๋””์Šคํฌ์ฝ๊ธฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ
    • ํŠน์ •ํŒจํ„ด์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋งŽ์€๊ฒฝ์šฐ (join like)
    • ๋งค์šฐ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”๋ ˆใ…”์ฝ”๋“œ๋ฅผ ํญ๋„“๊ฒŒ ์ฝ๋Š” ๊ฒฝ์šฐ

ํŠธ๋žœ์žญ์…˜๊ณผ ์ž ๊ธˆ


์ž ๊ธˆ๊ณผ ํŠธ๋žœ์žญ์…˜์€ ์„œ๋กœ ๋น„์Šทํ•œ ๊ฐœ๋… ๊ฐ™์ง€๋งŒ, ์‚ฌ์‹ค ์ž ๊ธˆ์€ ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด๊ณ  ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

MySQL ์—”์ง„์˜ ์ž ๊ธˆ

๊ธ€๋กœ๋ฒŒ ๋ฝ

FLUSH TABLES WITH READ LOCK์œผ๋กœ ํš๋“

  • MySQL์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž ๊ธˆ ๊ฐ€์šด๋ฐ ๊ฐ€์žฅ ๋ฒ”์œ„๊ฐ€ ํฌ๋‹ค.
  • ์„œ๋ฒ„ ์ „์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ, ํ…Œ์ด๋ธ”์€ ๋ฌผ๋ก  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋‹ฌ๋ผ๋„ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.
  • sqldump์ˆ˜์ค€์œผ๋กœ ๋ฐฑ์—…์„ ํ• ๋•Œ๋‚˜ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋งˆ์ €๋„ 8.0์—์„œ๋Š” ๋ฐฑ์—…๋ฝ์„ ์‚ฌ์šฉ
    • ๋ฐฑ์—…๋ฝ์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด db/table๋“ฑ ๋ชจ๋“  ๊ฐ์ฒด ์ƒ์„ฑ ๋ณ€๊ฒฝ์€ ๋ง‰ํžˆ๊ณ , ์œ ์ €๊ด€๋ จ๋„ ๋ง‰ํžˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ…Œ์ด๋ธ” ๋ฝ

LOCK TABLES table_name [read | write] ๋กœ ํš๋“

  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŠน๋ณ„ํ•œ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ฉด, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ• ์ผ ์—†๋‹ค.
  • DDL์— ์ž ๊น ๊ฑธ๋ฆผ

๋„ค์ž„๋“œ ๋ฝ

  • ๋ง๊ทธ๋Œ€๋กœ ํŠน์ • ๋ฌธ์ž์—ด์—๋Œ€ํ•œ ๋ฝ์„ ํš๋“ํ•˜๋Š”๊ฒƒ
  • ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ์˜ ๊ฒฝ์Ÿ์กฐ๊ฑด์ด๋‚˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์— ์“ฐ์ด๊ธฐ๋„ํ•จ

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

  • ๋ช…์‹œ์ ์ด์ง€ ์•Š์Œ

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

  • ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ๋ฝ์„ ์ง€์›
  • ์›๋ž˜๋Š” ์ž ๊ธˆ ์ •๋ณด๋ฅผ ์–ป๋Š”๊ฒŒ ๊นŒ๋‹ค๋กœ์› ๋Š”๋ฐ, information_schema ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ INNODB_TRX, INNODB_LOCKS, INNODB_LOCK_WAITS ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•ด์„œ ํ™•์ธ๊ฐ€๋Šฅ
  • ์ตœ๊ทผ์—๋Š” Performance Schema๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋‹ˆํ„ฐ๋ง๋„ ๊ฐ€๋Šฅ

๋ ˆ์ฝ”๋“œ ๋ฝ

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

๊ฐญ ๋ฝ

  • MySQL๋งŒ์˜ ํŠน์ˆ˜ํ•œ ๋ฝ
  • ๋ ˆ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ ˆ์ฝ”๋“œ์™€ ๋ฐ”๋กœ ์ธ์ ‘ํ•œ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ธˆ
  • ๋„ฅ์Šคํ„ฐ ํ‚ค ๋ฝ๊ณผ ๊ฐ™์ด ์„ค๋ช…๋˜์–ด์•ผํ•จ

๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ

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

AUTO_INCREMENT ๋ฝ

  • ํ…Œ์ด๋ธ”๋ฝ์ด์—ˆ๋‹ค.
  • ๋ช…์‹œ์ ์œผ๋กœ ์–ป์„ ๋ฐฉ๋ฒ•์€ ์—†๋‹ค.(postgres ์ตœ๊ณ ..)

์ธ๋ฑ์Šค์™€ ์ž ๊ธˆ

  • ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ๋ฝ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ธ๋ฑ์Šค๊ฐ€ ์•ˆ๊ฑธ๋ ค ์žˆ๋‹ค๋ฉด, ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฝ์ด๊ฑธ๋ฆฐ๋‹ค. ํ’€ํ…Œ์ด๋ธ” ์Šค์บ”์„ ํ•˜๋ฉด ํ…Œ์ด๋ธ”๋ฝ์ด ๊ฑธ๋ฆฐ๋‹ค.
CREATE TABLE orders (
ย  ย  id INT AUTO_INCREMENT PRIMARY KEY,
ย  ย  customer_id INT,
ย  ย  amount DECIMAL(10,2),
ย  ย  status VARCHAR(20),
ย  ย  INDEX idx_customer (customer_id) -- customer_id์— ์ธ๋ฑ์Šค ์ถ”๊ฐ€
) ENGINE=InnoDB;

  

INSERT INTO orders (customer_id, amount, status) VALUES
(1, 100.00, 'pending'),
(1, 200.00, 'pending'),
(1, 300.00, 'pending'),
(2, 400.00, 'pending'), 
(2, 500.00, 'pending');

BEGIN;
UPDATE orders SET status = 'completed' WHERE customer_id = 1 AND amount = 300;

-- customer id 1์ธ ์ฃผ๋ฌธ rows ๋‹ค์ž ๊น€

๋ ˆ์ฝ”๋“œ ์ˆ˜์ค€์˜ ์ž ๊ธˆ ํ™•์ธ ๋ฐ ํ•ด์ œ

information_schema๋Š” deprecated ๋˜๋Š”์ค‘ performance_schema์˜ data_locks, data_lock_waits๋ฅผ ์œ„์ฃผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ

์กฐํšŒ ์˜ˆ์‹œ๋Š” [[MySQL-Record-Lock-Queries]] ์—ฌ๊ธฐ์— ๋ณ„๋„ ์ •๋ฆฌ

MySQL์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

๊ฒฉ๋ฆฌ ์ˆ˜์ค€ย  ย  ย  ย  ย  Dirty Read Non-repeatable Read Phantom Read ์„ค๋ช…
READ UNCOMMITTED O ย  ย  ย  ย  O ย  ย  ย  ย  ย  ย  ย  ย  Oย  ย  ย  ย  ย  ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Œ
READ COMMITTED ย  X ย  ย  ย  ย  O ย  ย  ย  ย  ย  ย  ย  ย  O ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์Œ (Oracle ๊ธฐ๋ณธ๊ฐ’)
REPEATABLE READย  X ย  ย  ย  ย  X ย  ย  ย  ย  ย  ย  ย  ย  O ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Œ (InnoDB์—์„œ๋Š” ๋ฐฉ์ง€๋จ) (MySQL ๊ธฐ๋ณธ๊ฐ’)
SERIALIZABLE X ย  ย  ย  ย  X ย  ย  ย  ย  ย  ย  ย  ย  Xย  ย  ย  ย  ย  ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์„ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ฒ˜๋ฆฌ, ๋™์‹œ์„ฑ์„ ๊ฑฐ์˜ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ
  • Dirty Read: ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์•„์ง ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒƒ
  • Non-repeatable Read: ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ์„ ๋•Œ ๋‹ค๋ฅธ ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ
  • Phantom Read: ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฝ์ž…๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์ด ๊ฐ์ง€๋˜๋Š” ํ˜„์ƒ
  • ์•„๋ž˜๋กœ ๊ฐˆ์ˆ˜๋ก ๊ฒฉ๋ฆฌ(๊ณ ๋ฆฝ) ์ •๋„๊ฐ€ ๋†’์•„์ง€๋ฉฐ, ๋™์‹œ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค.
  • SQLํ‘œ์ค€ ์ƒ REPEATABLE READ์—์„œ Pantom read๋Š” ๋ฐœ์ƒํ• ์ˆ˜ ์žˆ์ง€๋งŒ, MySQLํŠน์„ฑ์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ผ๋ฐ˜์ ์ธ ์˜จ๋ผ์ธ ์„œ๋น„์Šค ์šฉ๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ฃผ๋กœ READ COMMITTED, REPEATABLE READ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

READ_UNCOMMITTED

  • Dirty Read๊ฐ€ ๋ฐœ์ƒํ•จ.
  • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์œผ๋กœ ์ธ์ •ํ•˜์ง€ ์•Š์„์ •๋„๋กœ ์ •ํ•ฉ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ๋งŽ์Œ.

READ COMMITTED

  • ์š”์ ์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ง„ํ–‰์ค‘์ด๋ฉด, ์–ธ๋‘๋กœ๊ทธ์—์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๊ฐ„๋‹ค๋Š” ๊ฒƒ.
  • ‘์ผ๋ฐ˜์ ์ธ’์˜จ๋ผ์ธ ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํŠธ๋žœ์žญ์…˜ ๋ ˆ๋ฒจ
  • Non-repeatable-read๋Š” ๋ฐœ์ƒํ•จ
    • ์ฐธ๊ณ ๋กœ READ_COMMITTED, REPEATABLE READ ์—์„œ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ select
    • READ_COMMITED๋Š” ํ•œ ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰์ค‘์— ๋‹ค๋ฅธํŠธ๋žœ์ด ์ปค๋ฐ‹์„ ์„ฑ๊ณตํ•˜๋ฉด ๊ทธ ํŠธ๋žœ์žญ์…˜์€ ๋™์ผํ•œ select๋ฅผ ๋ณด์žฅ๋ฐ›์ง€ ๋ชปํ•œ๋‹ค.

REPEATABLE READ

  • READ COMMITTED์™€์˜ ์ฐจ์ด์ ์€, ์–ธ๋‘์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ์˜ ๋ช‡๋ฒˆ์งธ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ์ฐพ์•„๋“ค์–ด๊ฐ€๋ƒ์— ์žˆ๋‹ค.
  • ๋ชจ๋“  InnoDB์˜ ํŠธ๋žœ์žญ์…˜์€ ๊ณ ์œ ํ•œ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์–ธ๋‘์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์—๋Š” ๋ณ€๊ฒฝ์„ ๋ฐœ์ƒ์‹œํ‚จ ํŠธ๋žœ์žญ์…˜์˜ ๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋ผ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ธ๋‘์˜์—ญ์˜ ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ๋Š” InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ์‹œ์ ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œํ•œ๋‹ค.
  • REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” MVCC๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜ ๊ฐ€์šด๋ฐ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ณด๋‹ค ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๊ฐ€ ์•ž์„  ์–ธ๋‘ ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๋Š” ์‚ญ์ œํ•  ์ˆ˜ ๊ฐ€ ์—†๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๊ณ  ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ ์ด์ „์˜ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ์–ธ๋‘ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” ํŠน์ • ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ์˜ ๊ตฌ๊ฐ„ ๋‚ด์—์„œ ๋ฐฑ์—…๋œ ์–ธ๋‘๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์กด๋ผ์•ผ ํ•œ๋‹ค.
1. A ํŠธ๋žœ์žญ์…˜์ด 100๋ฒˆ์œผ๋กœ ์‹œ์ž‘
2. B ํŠธ๋žœ์žญ์…˜์ด 101๋ฒˆ์œผ๋กœ A๊ฐ€ ๋ณด๊ณ ์žˆ๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ปค๋ฐ‹
3. C ํŠธ๋žœ์žญ์…˜์ด 102๋ฒˆ์œผ๋กœ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ปค๋ฐ‹

์ด ์ƒํ™ฉ์—์„œ READ COMMITTED๋Š” B,C ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹๊ณผ ํ•จ๊ป˜ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์˜ ์–ธ๋‘๋กœ๊ทธ๋ฅผ ์ „๋ถ€ ์‚ญ์ œ ํ•  ์ˆ˜ '์žˆ์ง€๋งŒ',
REPEATABLE READ์—์„œ๋Š” 100๋ฒˆ์ด ์‹คํ–‰์ค‘์ธ๋™์•ˆ์€ ์–ธ๋‘๋กœ๊ทธ๋ฅผ 100๋ฒˆ์ด์ „์œผ๋กœ ์‚ญ์ œ๋ฅผ ๋ชปํ•˜๊ฒŒ ๋ง‰์•„์ค€๋‹ค๋Š” ์ด์•ผ๊ธฐ!

SERIALIZABLE

  • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์ด์ž, ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ์ˆ˜์ค€
  • ๋™์‹œ ์ฒ˜๋ฆฌ ์ž‘์—…์€ ๋–จ์–ด์ง
  • ํ˜„์‹ค์„ฑ๋„ ์ž˜ ์—†์ง€๋งŒ, ๊ทธ๋‚˜๋งˆ ๊ณ ๋ คํ•˜๋Š” ์ด์œ ๊ฐ€ pantom read์ธ๋ฐ mysql์—์„œ๋Š” ๊ทธ๊ฒƒ ์กฐ์ฐจ๋„ ๋ฐฉ์ง€๋ผ์„œ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์‚ฌ์‹ค์ƒ ์—†์Œ

๋ฐ์ดํ„ฐ ์••์ถ•


ํŽ˜์ด์ง€์••์ถ•

  • ์„œ๋ฒ„๊ฐ€ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š” ์‹œ์ ์— ์••์ถ•ํ•˜๊ณ , ๋ถˆ๋Ÿฌ์˜ค๋ฉด ์••์ถ•์ด ํ•ด์ œ๋จ ์ฆ‰ ๋ฒ„ํผํ’€์— ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๊ฐ€ ์ ์žฌ๋˜๋ฉด ์••์ถ•์ด ํ•ด์ œ๋œ ์ƒํƒœ๋กœ๋งŒ ๊ด€๋ฆฌ
  • ์šด์˜์ฒด์ œ์™€ ํ•˜๋“œ์›จ์–ด์—์„œ ๋‘˜ ๋‹ค ์ง€์›ํ•ด์•ผ ์œ ์˜๋ฏธํ•จ
  • ๊ทธ๋ž˜์„œ ์ž˜ ์‚ฌ์šฉ์•ˆํ•จ

ํ…Œ์ด๋ธ”์••์ถ•

  • ์ผ๋ฐ˜์ ์œผ๋กœ ํ™œ์šฉ๋„ ๋†’์Œ
  • ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹จ์ ๋„ ์žˆ์Œ
    • ๋ฒ„ํผํ’€ ๊ณต๊ฐ„ ํ™œ์šฉ๋ฅ ์ด ๋‚ฎ์Œ
    • ์ฟผ๋ฆฌ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋‚ฎ์Œ
    • ๋นˆ๋ฒˆํ•œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‹œ ์••์ถ•๋ฅ ์ด ๋–จ์–ด์ง
  • ํŽ˜์ด์ง€ ํฌ๊ธฐ์— ๋”ฐ๋ผ์„œ ํŽ˜์ด์ง€ ํƒ€๊ฒŸ(์••์ถ• ๋ชฉํ‘œ ํฌ๊ธฐ)๋ฅผ ์„ค์ •ํ•˜๋Š”๋ฐ, ์••์ถ• ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅผ์ˆ˜ ์žˆ๊ณ  ์‹ค์ œ๋กœ ํƒ€๊ฒŸ๋ณด๋‹ค ํฌ๊ฒŒ๋˜๋ฉด ์Šคํ”Œ๋ฆฟ์„ ํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ๋ฅผ ์ž˜ ํ•ด๋ณด๊ณ  ์„ค์ •ํ•ด์•ผํ•จ
    • ์˜ˆ๋ฅผ๋“ค์–ด ํƒ€๊ฒŸ์ด 4kb, 8kb์ธ๋ฐ ์‹ค์ œ ๊ฒฐ๊ณผ ์ฐจ์ด๊ฐ€ ๋ณ„๋กœ ์•ˆ๋‚œ๋‹ค๋ฉด 8kb

๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ด๋ธ”์••์ถ•์—์„œ๋Š” InnoDB ๋ฒ„ํผํ’€๋กœ์˜ฌ๋ฆฌ๋ฉด, ์••์ถ•๋œํŽ˜์ด์ง€์™€ ํ•ด์ œ๋œ ํŽ˜์ด์ง€ ๋ชจ๋‘๋ฅผ ๊ด€๋ฆฌํ•ด์•ผํ•˜๊ณ , ์••์ถ• ์ž์ฒด๊ฐ€ cpu์†Œ๋ชจ๊ฐ€ ์—„์ฒญ๋‚˜๊ธฐ์— ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผํ• ๊ฒƒ

LZ77, Huffman Encoding์„ ์‚ฌ์šฉ, ๊ด€๋ จ ๋‚ด์šฉ ์ •๋ฆฌ -> [[๋ฐ์ดํ„ฐ-์••์ถ•]]

๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”


  • ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ๋Š” ์•”ํ˜ธํ™”๊ฐ€ ๋˜์ง€ ์•Š๊ณ  ๋””์Šคํฌ I/O ์ฆ‰ ์“ฐ๊ธฐ, ์ฝ๊ธฐ์‹œ์—๋งŒ ์•”ํ˜ธํ™” ๋ณตํ˜ธํ™”๊ฐ€ ์ด๋ฃจ์–ด์ ธ ์‚ฌ์šฉ์ž๋Š” ์‹ ๊ฒฝ์„ ์“ธ ํ•„์š”๋Š” ์—†์Œ
  • master key์™€ tablespace key(private key)๋ผ๋Š” ๋‘ ์ข…๋ฅ˜์˜ ํ‚ค๋ฅผ ์ด์šฉ
  • ์™ธ๋ถ€ ํ‚ค ๊ด€๋ฆฌ ์†”๋ฃจ์…˜ ํ˜น์€ ๋””์Šคํฌ์˜ ํŒŒ์ผ์—์„œ ๋งˆ์Šคํ„ฐํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์•”ํ˜ธํ™”๋œ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋  ๋•Œ ๋งˆ๋‹ค ํ•ด๋‹น ํ…Œ์ด๋ธ”์„ ์œ„ํ•œ ์ž„์˜์˜ ํ…Œ์ด๋ธ” ์ŠคํŽ˜์ด์Šค ํ‚ค๋ฅผ ๋ฐœ๊ธ‰.
  • ๋งˆ์Šคํ„ฐํ‚ค์˜ ๊ด€๋ฆฌ๋ฅผ ์œ ์˜ํ•ด์•ผํ•จ, ๋งˆ์Šคํ„ฐํ‚ค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ธฐ์กด ํ‚ค๋กœ ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šคํ‚ค๋ฅผ ๋ณตํ˜ธํ™” ํ•˜๊ณ  ๋‹ค์‹œ ์ƒˆ๋กœ์šด ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•จ
  • ์ด๋Ÿฐ ๊ตฌํ˜„๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด db๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ db์•”ํ˜ธํ™”๋ฅผ ํ•˜๋Š”๊ฒŒ ๋‚˜์Œ(์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•”ํ˜ธํ™”๋ณด๋‹ค)
  • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋‚˜ ์–ธ๋‘๋กœ๊ทธ๋Š” ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋  ์ˆ˜ ์žˆ์–ด ์„ค์ •์— ์œ ์˜

์ธ๋ฑ์Šค


๋””์Šคํฌ ์ฝ๊ธฐ ๋ฐฉ์‹

Random I/O์™€ Sequential I/O์ •๋ฆฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์ฟผ๋ฆฌํŠœ๋‹์— ์–ด๋А ์ •๋„ ์ง€์‹์„ ๊ฐ–์ถ˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ ˆ๊ฐํ•˜๊ณ  ์žˆ๋“ฏ์ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์„ฑ๋Šฅ ํŠœ๋‹์€ ์–ด๋–ป๊ฒŒ Disk I/O๋ฅผ ์ค„์ด๋А๋ƒ๊ฐ€ ๊ด€๊ฑด์ผ ๋•Œ ๊ฐ€ ์ƒ๋‹นํžˆ ๋งŽ๋‹ค.

HDD vs SSD

ํ•œ๋ฒˆ์— ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ˆœ์ฐจ I/O์—์„œ๋Š” SSD๊ฐ€ HDD๋ณด๋‹ค ์กฐ๊ธˆ ๋น ๋ฅด๊ฑฐ๋‚˜ ๊ฑฐ์˜ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ด๊ธฐ๋„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋žœ๋ค I/O๊ฐ€ ํ›จ์”ฌ ๋น ๋ฅด๋‹ค๋Š”๊ฒŒ ์žฅ์ ์ด๋‹ค.

Random I/O vs Sequential I/O

  • ์›๋ž˜๋Š” ํ•˜๋“œ๋””์Šคํฌ๋Š” ์‹ค์ œ ์›ํŒ์„ ๋Œ๋ ค์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ์œ„์น˜๋กœ ๋””์Šคํฌ ํ—ค๋”๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ์Œ
  • ๊ฑฐ๊ธฐ์„œ ๋‚˜์˜จ ์šฉ์–ด
  • ์‹ค์ œ 3๊ฐœ์˜ ํŽ˜์ด์ง€๋ฅผ ์‚ฝ์ž…ํ•˜๋”๋ผ๋„, ์—ฐ์†์ ์œผ๋กœ ์‚ฝ์ž…ํ•˜๋Š”๊ฒƒ๊ณผ ๋žœ๋คํ•œ ์œ„์น˜์— ์‚ฝ์ž…ํ•˜๋Š”๊ฒฝ์šฐ ๋””์Šคํฌ ํ—ค๋”๋ฅผ ๋Œ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์ฝœ์˜ ํšŸ์ˆ˜๊ฐ€ ์„ธ๋ฐฐ ์ฐจ์ด + ๋””์Šคํฌ ํšŒ์ „์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊นŒ์ง€

์‚ฌ์‹ค ์ฟผ๋ฆฌ๋ฅผ ํŠœ๋‹ํ•ด์„œ ๋žœ๋ค i/o๋ฅผ ์ˆœ์ฐจ i/o๋กœ ๋ฐ”๊ฟ”์„œ ์‹คํ–‰ํ•  ๋ฐฉ๋ฒ•์€ ๊ทธ๋‹ค์ง€ ๋งŽ์ง€ ์•Š๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ํŠœ๋‹ํ•˜๋Š” ๊ฒƒ์€ ๋žœ๋คi/o ์ž์ฒด๋ฅผ ์ค„์—ฌ์ฃผ๋Š”๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค. ์—ฌ๋ฆฌ์„œ ๋žœ๋ค i/o๋ฅผ ์ค„์ธ๋‹ค๋Š” ๊ฒƒ์€ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๊ผญ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ๋„๋ก ์ฟผ๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ธ๋ฑ์Šค๋ž€?

์นผ๋Ÿผ์˜ ๊ฐ’๊ณผ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ํ‚ค๋ฐธ๋ฅ˜๋กœ ์‚ผ์•„ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ์ •๋ ฌ์„ ์œ ์ง€ํ•œ๋‹ค. sorted ๊ฒฐ๋ก ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ์˜ ์„ฑ๋Šฅ์„ ํฌ์ƒํ•˜๊ณ (์ •๋ ฌํ•˜๋А๋ผ), ์ฝ๊ธฐ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด ์ฑ…์—์„œ๋Š” ํ‚ค๋ผ๋Š” ๋ง๊ณผ ์ธ๋ฑ์Šค๋Š” ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค

  • ์ธ๋ฑ์Šค์˜ ์—ญํ• ๋ณ„ ๊ตฌ๋ถ„
    • Primary Key : ๊ทธ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ์นผ๋Ÿผ์˜ ๊ฐ’์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ธ๋ฑ์Šค (ํ…Œ์ด๋ธ”์—์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ธฐ์ค€๊ฐ’ - ์‹๋ณ„์ž)
    • Secondary Key : ํ”„๋ผ์ด๋จธ๋ฆฌํ‚ค๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์ธ๋ฑ์Šค

B-Tree ์ธ๋ฑ์Šค

B-Tree ์ธ๋ฑ์Šค์˜ ๊ตฌ์กฐ ๋ฐ ํŠน์„ฑ

  • ์ตœ์ƒ์œ„ ํ•˜๋‚˜์˜ ๋ฃจํŠธ๋…ธ๋“œ์™€ ํ•˜์œ„์— ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ถ™์–ด์žˆ์Œ
  • ๊ฐ€์žฅ ํ•˜์œ„์˜ ๋…ธ๋“œ๋ฅผ ๋ฆฌํ”„๋…ธ๋“œ๋ผ๊ณ  ํ•˜๋ฉฐ, ์ค‘๊ฐ„์— ์žˆ์œผ๋ฉด ๋ธŒ๋žœ์น˜ ๋…ธ๋“œ๋ผ๊ณ  ํ•จ
  • ๋ฆฌํ”„๋…ธํŠธ๋“œ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๊ฐ€๊ธฐ ์œ„ํ•œ ์ฃผ์†Ÿ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

๋ ˆ์ฝ”๋“œ๋Š” ๋‹น์—ฐํžˆ ์ •๋ ฌ๋ผ ์žˆ์ง€ ์•Š๊ณ , insert๋œ ์ˆœ์„œ๋กœ ์ €์žฅ๋˜์–ด์žˆ์ง€๋„ ์•Š๋‹ค.

  • ์ฐธ๊ณ ๋กœ MySQL, InnoDB์˜ ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค์˜ ๋ฆฌํ”„๋…ธ๋“œ๋Š” ๋ ˆ์ฝ”๋“œ ์ฃผ์†Œ๋ฅผ ํ”„๋ผ์ด๋จธ๋ฆฌํ‚ค๋กœ ๋…ผ๋ฆฌ์  ์ฃผ์†Œ๋กœ ์“ฐ๊ณ  ์žˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ PK์˜ bํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ํƒ€์•ผ ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

B-Tree ์ธ๋ฑ์Šค ํ‚ค ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ

์ธ๋ฑ์Šค ํ‚ค ์ถ”๊ฐ€

  • ์ƒˆ๋กœ์šด ํ‚ค ๊ฐ’์ด B-Tree์— ์ €์žฅ๋  ๋•Œ, ํ…Œ์ด๋ธ”์˜ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ํ‚ค ๊ฐ’์ด ์ฆ‰์‹œ ์ธ๋ฑ์Šค์— ์ €์žฅ๋  ์ˆ˜ ๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‚ค๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด ์ ์ ˆํ•œ ์œ„์น˜๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , ํ•ด๋‹น์œ„์น˜์˜ ๋ฆฌํ”„๋…ธ๋“œ์— ๋ ˆ์ฝ”๋“œ ํ‚ค๊ฐ’๊ณผ, ์ฃผ์†Œ์ •๋ณด๋ฅผ ๋ฆฌํ”„๋…ธ๋“œ์— ์ €์žฅํ•ด์•ผํ•œ๋‹ค.
  • ๋ฆฌํ”„๋…ธ๋“œ๊ฐ€ ๊ฝ‰์ฐจ๋ฉด split์ด ์ผ์–ด๋‚˜์•ผํ•˜๋Š”๋ฐ, ์ด split์€ ๋ธŒ๋žœ์น˜๋…ธ๋“œ์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ์ž‘์—…์ด๋‹ค.
  • ์ธ๋ฑ์Šค์˜ ์ถ”๊ฐ€๋กœ ์ธํ•ด Insert, Update์— ๊ฐˆ ์˜ํ–ฅ์„ ๋Œ€๋žต์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š”๋ฒ•
    • ๊ธฐ๋ณธ ๋น„์šฉ์„ 1์ด๋ผ ๊ฐ€์ •
    • ์ธ๋ฑ์Šค์— ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—… ๋น„์šฉ์„ 1.5๋ผ ๊ฐ€์ •
    • ์˜ˆ๋ฅผ๋“ค์–ด 3๊ฐœ์ธ๊ฒฝ์šฐ (1.5 * 3 + 1) 5.5๊ฐ€ ์†Œ์š”
    • ์ด๊ฑด ์ธ๋ฑ์Šค๋งˆ๋‹ค ์ธ๋ฑ์ŠคํŽ˜์ด์ง€๋ฅผ ์ฝ๊ณ  ์จ์•ผํ•ด์„œ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
  • InnoDB๋Š” ์ฐธ๊ณ ๋กœ ํ‚ค์ถ”๊ฐ€์— ์•ฝ๊ฐ„์˜ ์ตœ์ ํ™”๊ฐ€ ๋˜์–ด์žˆ๋‹ค.
    • ๋งŒ์•ฝ Unique๊ฐ€ ์•„๋‹ˆ๋ฉด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ง€์—ฐ์‹œํ‚ด

์ธ๋ฑ์Šค ํ‚ค ์‚ญ์ œ

  • ์‚ญ์ œ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค, ๊ทธ๋ƒฅ ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ์ฐพ์•„์„œ ์‚ญ์ œ ๋งˆํฌ๋งŒ ํ•˜๋ฉด ์™„๋ฃŒ๋œ๋‹ค.(์ถ”ํ›„ ์žฌํ™œ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œ ๊ฐ€๋Šฅ)
  • ๋ฌผ๋ก  ์Šคํ”Œ๋ฆฟ๊ฐ™์€ ๋ถ€๋ถ„์—์„œ ์ ˆ์ฐจ์ ์œผ๋กœ ๊ฐ„๋‹จํ•œ ๊ฒƒ์ด์ง€ disk i/o๋Š” ๋ฐœ์ƒํ•œ๋‹ค.

์ธ๋ฑ์Šค ํ‚ค ๋ณ€๊ฒฝ

  • ๋ถ€ํ•˜๊ฐ€ ๊ฐ€์žฅ ์‹ฌํ•จ, ์‚ญ์ œ๋ฅผ ํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

์ธ๋ฑ์Šค ํ‚ค ๊ฒ€์ƒ‰

  • ํŠธ๋ฆฌํƒ์ƒ‰, log n ๋ณต์žก๋„, ์œ„์˜ ๊ฒƒ๋“ค์„ ๊ฐ์ˆ˜ํ•œ๋งŒํผ ๋น ๋ฅธ ์„ฑ๋Šฅ
  • 100ํผ์„ผํŠธ ์ผ์น˜, ํ˜น์€ ๊ฐ’์˜ ์•ž๋ถ€๋ถ„๋งŒ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ (like test%)
  • ๋ถ€๋“ฑํ˜ธ ๋น„๊ต ์กฐ๊ฑด์—์„œ๋„ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ‚ค ๊ฐ’์˜ ๋’ท๋ถ€๋ถ„๋งŒ ๊ฒ€์ƒ‰ํ•˜๋Š” ์šฉ๋„๋กœ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ธ๋ฑ์Šค ํ‚ค๊ฐ’์— ๋ณ€ํ˜•์ด ๊ฐ€ํ•ด์ง„ ํ›„ ๋น„๊ต๋˜๋Š”๊ฒฝ์šฐ์—๋Š” B-Tree์˜ ๋น ๋ฅธ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์—†๋‹ค.
SELECT * FROM users WHERE LOWER(email) = 'test@example.com';

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์˜ ์ธ๋ฑ์Šค๋Š” ๋” ํŠน๋ณ„ํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค. InnoDB ํ…Œ์ด๋ธ”์—์„œ ์ง€์›ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ์ด๋‚˜, ๋„ฅ์ŠคํŠธ ํ‚ค๋ฝ์ด ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ž ๊ทผ ํ›„ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทธ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ UPDATE, DELETE๋ฌธ์žฅ์ด ์‹คํ–‰ ๋  ๋•Œ ํ…Œ์ด๋ธ”์— ์ ์ ˆํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฉด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŽ์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทผ๋‹ค.

B-Tree ์ธ๋ฑ์Šค ์‚ฌ์šฉ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ

์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์นผ๋Ÿผ์˜ ํฌ๊ธฐ์™€ ๋ ˆ์ฝ”๋“œ์˜ ๊ฑด์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ์œ ๋‹ˆํฌํ•œ ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์˜ ๊ฐœ์ˆ˜๋“ฑ์— ์˜ํ•ด ๊ฒ€์ƒ‰์ด๋‚˜ ๋ณ€๊ฒฝ ์ž‘์—…์˜ ์„ฑ๋Šฅ์ด ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์˜ ํฌ๊ธฐ

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

  • ๊ธฐ๋ณธ์ ์œผ๋กœ innoDB์˜ ํŽ˜์ด์ง€ ์—”์ง„ ๋‹จ์œ„๋Š” 16kb (์„ค์ • ๊ฐ€๋Šฅ)
  • ์ธ๋ฑ์Šค ํ‚ค๊ฐ€ 16byte, ์ž์‹๋…ธ๋“œ์˜ ์ฃผ์†Œ๊ฐ€ ๋Œ€๋ ฅ์ ์œผ๋กœ 12byte๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„๋•Œ ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€(16kb)์— 585๊ฐœ ์ •๋„์˜ ํ‚ค๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌธ์ œ๋Š” ์ธ๋ฑ์Šค ํ‚ค๊ฐ’์ด ์ปค์ง€๋ฉด ํŽ˜์ด์ง€์— ์ €์žฅ๋˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์ค„์–ด๋“ค๊ฒƒ์ด๊ณ , ๊ทธ ์ค„์–ด๋“ ๊ฒŒ ์„ฑ๋Šฅ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.
    • ์˜ˆ๋ฅผ๋“ค์–ด 500๊ฐœ์˜ ๋ฒ”์œ„๋ฅผ ๊ธ์–ด์˜ค๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ธ๋Š”๋ฐ,
    • ํ‚ค๊ฐ€ ์ปค์ ธ์„œ ํŽ˜์ด์ง€๋‹น 300๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค๋ฉด,
    • ์ตœ์†Œ ๋‘๋ฒˆ์˜ disc I/O๊ฐ€ ๋ฐœ์ƒ
  • ์ถ”๊ฐ€์ ์œผ๋กœ ์ธ๋ฑ์Šค ํ‚ค๊ฐ’์ด ์ปค์ง€๋ฉด, ์ธ๋ฑ์Šค ์ž์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋Š”๊ฒƒ์œผ๋กœ, ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œํ•ด๋‘˜ ์ˆ˜ ์žˆ๋Š” ๋ ˆ์ฝ”๋“œ์ˆ˜๋Š” ๊ฐ์†Œํ•œ๋‹ค.

B-Tree์˜ ๊นŠ์ด

  • ํ‚ค๊ฐ’์ด ๋Š˜์–ด๋‚˜์„œ ํŽ˜์ด์ง€๋‹น ํ‚ค๊ฐ’์ด ์ค„์–ด๋“ค๋ฉด ๊นŠ์ด๋„ ๋Š˜์–ด๋‚œ๋“ ๋‹ค.
  • ์‚ฌ์‹ค ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”๊ฑด ์•„๋‹ˆ๊ณ  ์ธ๋ฑ์Šค ํ‚ค๊ฐ’์„ ์ค„์ด๋Š”๊ฒŒ ๋‚ซ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๊ธฐ์œ„ํ•ด์„œ ๊ฐ•์กฐํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

Selectivity(Cardinality)

  • ๊ฑฐ์˜ ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ๋ชจ๋“  ์ธ๋ฑ์Šค ํ‚ค๊ฐ’๊ฐ€์šด๋ฐ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ์ˆ˜๋ฅผ ์˜๋ฏธ
  • ์ „์ฒด ์ธ๋ฑ์Šค ํ‚ค๊ฐ’์ด 100๊ฐœ์ธ๋ฐ 10๊ฐœ๊ฐ€ ์œ ๋‹ˆํฌํ•˜๋‹ค๋ฉด selectivity ๋Š” 10
  • ์„ ํƒ๋„๊ฐ€ ๋†’์„์ˆ˜๋ก ๊ฒ€์ƒ‰ ๋Œ€์ƒ์ด ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋งŒํผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • ๋ฌผ๋ก  ์ •๋ ฌ์ด๋‚˜ ๊ทธ๋ฃจํ•‘๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์œ„ํ•ด ์ข‹์ง€์•Š์€ ์„ ํƒ๋„๋ผ๋„ ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ๋Š”๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค.
-- country, city์นผ๋Ÿผ์ด ์žˆ์œผ๋ฉฐ, ์ „์ฒด ๋ ˆ์ฝ”๋“œ๋Š” 1๋งŒ๊ฑด, countryํ…Œ์ด๋ธ”๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์„ ๋•Œ
-- ์ผ€์ด์Šค A: country ์นผ๋Ÿผ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ 10๊ฐœ
-- ์ผ€์ด์Šค b: country ์นผ๋Ÿผ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ 1000๊ฐœ

select *
from tb_test
where country='KOREA' and city='SEOUL';

-- ๋งŒ์•ฝ ์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‹จ ํ•œ ๊ฑด์ด๋ผ๋ฉด?
  • ์œ„์˜ ์˜ˆ์‹œ์—์„œ, a์˜๊ฒฝ์šฐ ํ‰๊ท ์ ์œผ๋กœ 1000๊ฑด์„ ์กฐํšŒํ•˜๊ฒŒ๋˜๊ณ , b์˜ ๊ฒฝ์šฐ ํ‰๊ท ์ ์œผ๋กœ 10๊ฑด์„ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.

์ฝ์–ด์•ผ ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์˜ ๊ฑด์ˆ˜

์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์ธ๋ฑ์Šค๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๋Š”๊ฒƒ๋ณด๋‹ค ๋†’์€ ๋น„์šฉ์ด ๋“œ๋Š” ์ž‘์—…์ด๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ ˆ์ฝ”๋“œ ํ•œ๊ฑด์„ ๊ทธ๋ƒฅ์ฝ๋Š” ๊ฒƒ ๋Œ€๋น„ ์ธ๋ฑ์Šค๋ฅผ ํƒ€๊ณ  ์ฝ๋Š”๊ฒŒ 4~5๋ฐฐ ์ •๋„ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค๊ณ  ์–ธ๊ธ‰๋œ๋‹ค.
  • ์ฆ‰ ๋งŒ์•ฝ ํ…Œ์ด๋ธ”์˜ 20~25%๊ฐ€ ์กฐํšŒ๋Œ€์ƒ์ธ๊ฒฝ์šฐ, ์ „์ฒด๋ฅผ ์ฝ๊ณ  ํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ๋งŒ ๊ฐ€๋ ค๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.
  • ์ด๋Ÿฐ ๊ณ„์‚ฐ์€ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํ•ด์ฃผ๊ธด ํ•˜์ง€๋งŒ, ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ๋“ค์–ด ์‹ค์ œ ์กฐํšŒ๋•Œ๋งˆ๋‹ค ํ…Œ์ด๋ธ”์˜ 30ํผ์„ผํŠธ ๋‚จ์ง“์„ ํผ๊ฐ€์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๊ฒƒ ‘๋•Œ๋ฌธ์—’ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š”์ง“์€ ํ•˜์ง€ ๋ง์•„์•ผํ•œ๋‹ค.

B-Tree ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

์–ด๋– ํ•œ ๊ฒฝ์šฐ์— ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ์œ ๋„ํ• ์ง€, ๋ฐ˜๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ• ์ง€ ํŒ๋‹จํ•˜๋ ค๋ฉด MySQL๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” ์Šคํ† ๋ฆฌ์ง€์—”์ง„์ด ์–ด๋–ป๊ฒŒ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์‹ค์ œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋‚ด๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค.

์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”

  • ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด๊ณ , ๋’ค์— ์„ค๋ช…ํ•  ๋‚˜๋จธ์ง€ ๋‘๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹๋ณด๋‹ค๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•.
  • ๊ฒ€์ƒ‰ํ•ด์•ผํ•  ์ธ๋ฑ์Šค์˜ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋์„๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹
  • ์ฒ˜์Œ์—๋Š” ๋ฆฌํ”„๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€์„œ ์ฐพ๊ณ , ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ์–ด์„œ ๊ธ์–ด์˜จ๋‹ค(์Šค์บ”)
  • ๋ณดํ†ต ๋ฆฌํ”„๋…ธ๋“œ์—์„œ ๋ ˆ์ฝ”๋“œ(์˜ ์ฃผ์†Œ๋Š”) ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋˜์–ด์žˆ์–ด ๋‹ค์Œ ๋…ธ๋“œ๋„ ๋ฐ”๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์Šค์บ”ํ•˜๋“  ๊ด€๊ณ„์—†์ด, ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์นผ๋Ÿผ์˜ ์ •์ˆœ ๋˜๋Š” ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ๋ณ„๋„์˜ ์ •๋ ฌ๊ณผ์ •์ด ์ˆ˜๋ฐ˜๋˜๋Š”๊ฒƒ์ด์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค ์ž์ฒด์˜ ์ •๋ ฌ ํŠน์„ฑ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฐ๊ฒƒ
  • ์ธ๋ฑ์Šค์˜ ๋ฆฌํ”„๋…ธ๋“œ์—์„œ ๊ฒ€์ƒ‰์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๊ฑด๋“ค์€ ๋ฐ์ดํ„ฐํŒŒ์ผ์—์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.
  • ์ด ๋•Œ ๋ฆฌํ”„๋…ธ๋“œ์— ์ €์žฅ๋œ ๋ ˆ์ฝ”๋“œ ์ฃผ์†Œ๋กœ ๋ฐ์ดํ„ฐํŒŒ์ผ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์˜ค๋Š”๋ฐ ๋ ˆ์ฝ”๋“œ ํ•œ๊ฑด ํ•œ๊ฑด ๋‹จ์œ„๋กœ ๋žœ๋ค I/O๊ฐ€ ํ•œ๋ฒˆ ์”ฉ ์ผ์–ด๋‚œ๋‹ค.
  • ๊ฒฐ๋ก ์ ์œผ๋กœ
    • Index seek : ์ธ๋ฑ์Šค์—์„œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์ด ์ €์žฅ๋œ ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค.
    • Index sacn : ํƒ์ƒ‰๋œ ์œ„์น˜๋ถ€ํ„ฐ ํ•„์š”ํ•œ ๋งŒํผ ์ธ๋ฑ์Šค๋ฅผ ์ญ‰์ฝ๋Š”๋‹ค.
    • Index scan์˜ ๊ฒฐ๊ณผ๋กœ ์ฝ์–ด๋“ค์ธ ํ‚ค์™€ ๋ ˆ์ฝ”๋“œ ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ตœ์ข… ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
  • ์œ„์˜ 3๋ฒˆ์˜ ๊ณผ์ •์ด ํ•„์š”์—†๋Š” ๊ฒฝ์šฐ(์ฆ‰ ์ธ๋ฑ์Šค ๋‚ด์˜ ์ฒ˜๋ฆฌ์—์„œ๋งŒ์œผ๋กœ ์กฐํšŒ ๋Œ€์ƒ์ด ๋๋‚˜๋Š” ๊ฒฝ์šฐ)๋ฅผ Covering Index๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.
show status like 'Handler%';
๋ณ€์ˆ˜๋ช… ๊ฐ’ ย  ย  ์„ค๋ช…
Handler_commitย  ย  ย  ย  120 ย  ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋œ ํšŸ์ˆ˜
Handler_deleteย  ย  ย  ย  35ย  ย  ํ…Œ์ด๋ธ”์—์„œ ํ–‰์ด ์‚ญ์ œ๋œ ํšŸ์ˆ˜
Handler_discoverย  ย  ย  0 ย  ย  NDB Cluster์—์„œ ์ž๋™์œผ๋กœ ํ…Œ์ด๋ธ”์„ ๋ฐœ๊ฒฌํ•œ ํšŸ์ˆ˜
Handler_external_lock 500 ย  ํ…Œ์ด๋ธ” ์ž ๊ธˆ์„ ํš๋“ํ•œ ํšŸ์ˆ˜
Handler_mrr_initย  ย  ย  0 ย  ย  ๋‹ค์ค‘ ๋ฒ”์œ„ ์ฝ๊ธฐ(MRR)๊ฐ€ ์ดˆ๊ธฐํ™”๋œ ํšŸ์ˆ˜
Handler_prepare ย  ย  ย  60ย  ย  ํŠธ๋žœ์žญ์…˜์ด ์ค€๋น„๋œ ํšŸ์ˆ˜ (2PC์—์„œ ์‚ฌ์šฉ)
Handler_read_firstย  ย  5 ย  ย  ์ธ๋ฑ์Šค์˜ ์ฒซ ๋ฒˆ์งธ ํ–‰์„ ์ฝ์€ ํšŸ์ˆ˜
Handler_read_keyย  ย  ย  300 ย  ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ–‰์„ ์ฐพ์€ ํšŸ์ˆ˜
Handler_read_next ย  ย  450 ย  ์ธ๋ฑ์Šค ์Šค์บ”์—์„œ ๋‹ค์Œ ํ–‰์„ ์ฝ์€ ํšŸ์ˆ˜
Handler_read_prev ย  ย  20ย  ย  ์ธ๋ฑ์Šค ์Šค์บ”์—์„œ ์ด์ „ ํ–‰์„ ์ฝ์€ ํšŸ์ˆ˜
Handler_read_rndย  ย  ย  15ย  ย  ํŠน์ • ์œ„์น˜์—์„œ ํ–‰์„ ์ฝ์€ ํšŸ์ˆ˜
Handler_read_rnd_next 700 ย  ์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ”์—์„œ ๋‹ค์Œ ํ–‰์„ ์ฝ์€ ํšŸ์ˆ˜
Handler_rollbackย  ย  ย  10ย  ย  ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋œ ํšŸ์ˆ˜
Handler_updateย  ย  ย  ย  80ย  ย  ํ–‰์ด ์—…๋ฐ์ดํŠธ๋œ ํšŸ์ˆ˜
Handler_write 200 ย  ์ƒˆ๋กœ์šด ํ–‰์ด ์‚ฝ์ž…๋œ ํšŸ์ˆ˜
  • Handler_read_key ย  ย  โ†’ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ ํšŸ์ˆ˜ ย  ย  ๊ฐ’์ด ๋†’๋‹ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ย  ๊ฐ’์ด ๋‚ฎ๋‹ค๋ฉด ํ…Œ์ด๋ธ” ์Šค์บ”์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ.

  • Handler_read_rnd_next ย  ย  โ†’ ์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ”์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์€ ํšŸ์ˆ˜ ย  ย  ๊ฐ’์ด ๋†’๋‹ค๋ฉด ์ธ๋ฑ์Šค ์—†์ด ์ „์ฒด ํ…Œ์ด๋ธ”์„ ๋ฐ˜๋ณต ํƒ์ƒ‰ํ•˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ. ย  ย  ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ตœ์ ํ™”ํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ.

  • Handler_read_first ย  ย  โ†’ ์ธ๋ฑ์Šค์˜ ์ฒซ ๋ฒˆ์งธ ํ–‰์„ ์ฝ์€ ํšŸ์ˆ˜ ย  ย  ORDER BY ๋˜๋Š” GROUP BY ์ฟผ๋ฆฌ์—์„œ ์ฃผ๋กœ ๋ฐœ์ƒ.

  • Handler_read_next / Handler_read_prev ย  ย  โ†’ ์ธ๋ฑ์Šค ๋ฒ”์œ„ ์Šค์บ”์ด ์–ผ๋งˆ๋‚˜ ์ผ์–ด๋‚˜๋Š”์ง€ ์ธก์ • ย  ย  Handler_read_next ๊ฐ’์ด ๋†’๋‹ค๋ฉด, ์ธ๋ฑ์Šค ๋ฒ”์œ„ ๊ฒ€์ƒ‰์ด ํ™œ๋ฐœํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ.

  • Handler_read_rnd ย  ย  โ†’ ๋žœ๋คํ•˜๊ฒŒ ํŠน์ • ์œ„์น˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์€ ํšŸ์ˆ˜ ย  ย  ๊ฐ’์ด ๋†’๋‹ค๋ฉด ํŒŒ์ผ ์ •๋ ฌ(File Sort) ์ด ์ž์ฃผ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ.

  • Handler_commit & Handler_rollback ย  ย  โ†’ ํŠธ๋žœ์žญ์…˜์ด ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ปค๋ฐ‹๋˜๊ณ  ๋กค๋ฐฑ๋˜๋Š”์ง€ ย  ย  ํŠธ๋žœ์žญ์…˜์ด ๋„ˆ๋ฌด ์žฆ์œผ๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Œ.

์ธ๋ฑ์Šค ํ’€ ์Šค์บ”

  • ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋ ˆ์ธ์ง€์Šค์บ”๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ธ๋ฑ์Šค์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ชจ๋‘ ์ฝ๋Š” ๋ฐฉ์‹
  • ์ฟผ๋ฆฌ์˜ ์กฐ๊ฑด์ ˆ์— ์‚ฌ์šฉ๋œ ์นผ๋Ÿผ์ด ์ธ๋ฑ์Šค์˜ ์ฒซ๋ฒˆ์งธ ์นผ๋Ÿผ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ํ’€์Šค์บ” ๋ฐ˜์‹์ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ฆ‰ ์ฟผ๋ฆฌ๊ฐ€ ์ธ๋ฑ์Šค์— ๋ช…์‹œ๋œ ์นผ๋Ÿผ๋งŒ์œผ๋กœ ์กฐ๊ฑด์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฒฝ์šฐ์— ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค.

๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”

  • ์ง‘๊ณ„ ์ฟผ๋ฆฌ์—์„œ ํ•„์š”์—†๋Š”๊ฐ’ ๋„˜๊ธฐ๋Š” ์ธ๋ฑ์Šค
  • a, b ์นผ๋Ÿผ ๋ณตํ•ฉ์ธ๋ฑ์Šค์ธ๋ฐ, b๊ฐ€ ์ •๋ ฌ๋˜์–ด์žˆ์œผ๋ฉด
  • a๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๋ฉด์„œ ์ฒซ์ค„์˜ b๊ฐ’๋งŒ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด๋œ๋‹ค.

์ธ๋ฑ์Šค ์Šคํ‚ต ์Šค์บ”

  • ์ธ๋ฑ์Šค๋ฅผ ์Šคํ‚ตํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ตœ์ ํ™” ํ•ด์ฃผ๋Š”๊ฒƒ
  • ๋ณตํ•ฉ์ธ๋ฑ์Šค์—์„œ, ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ์„ ํ–‰์นผ๋Ÿผ์˜ ์œ ๋‹ˆํฌ๊ฐ’๋“ค์„ ๋‹ค ๋ฝ‘์•„์„œ ์—ฌ๋Ÿฌ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋Š”๊ฒƒ๊ณผ ๋น„์Šทํ•œ ํ˜•ํƒœ์˜ ์ตœ์ ํ™”
  • MySQL์—์„œ๋Š” ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค์ธ๊ฒฝ์šฐ๋งŒ ๊ฐ€๋Šฅ

๋‹ค์ค‘ ์นผ๋Ÿผ ์ธ๋ฑ์Šค

  • ๋ณต์ˆ˜์˜ ํ‚ค
  • ์™ผ์ชฝ๋ถ€ํ„ฐ ์ •๋ ฌ
  • ์นผ๋Ÿผ์˜ ์œ„์น˜๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ฒฐ์ •ํ•ด์•ผํ•จ

B-Tree ์ธ๋ฑ์Šค์˜ ์ •๋ ฌ ๋ฐ ์Šค์บ” ๋ฐฉํ–ฅ

  • ํ•ญ์ƒ ์˜ค๋ฆ„์ฐจ์ˆœ์ด๊ฑฐ๋‚˜ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋จ
  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ •๋ฆฌํ•ด์„œ ์‹คํ–‰๊ณ„ํš ์ˆ˜๋ฆฝ

์ธ๋ฑ์Šค์˜ ์ •๋ ฌ

์„ค์ •ํ•  ๋•Œ ๊ฐ€๋Šฅ 8.0 ์ด์ƒ

create index ix_teamname_userscore on employees (team_name asc, user_score desc)

์Šค์บ” ๋ฐฉํ–ฅ

  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์•Œ์•„์„œ ์ž˜ ์„ ํƒ

B-Tree ์ธ๋ฑ์Šค์˜ ๊ฐ€์šฉ์„ฑ๊ณผ ํšจ์œจ์„ฑ

select * from dept_emp
where dept_no='d002' and emp_no >= 10114
;

์ผ€์ด์Šค a: index(dept_no, emp_no)
์ผ€์ด์Šค b: index(emp_no, dept_no)
  • ์ผ€์ด์Šค a : “dept_no = ‘d002’ and emp_no >= 10114” ์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ๊ณ , d002๊ฐ€ ์•„๋‹๋•Œ๊นŒ์ง€ ์ญ‰ ์ฝ๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ - ํšจ์œจ์ 
  • ์ผ€์ด์Šค b : “dept_no = ‘d002’ and emp_no >= 10114” ์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ๊ณ , ๊ทธ ์ดํ›„ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๊ฐ€ d002์ธ์ง€ ๋น„๊ตํ•ด์•ผํ•œ๋‹ค.
  • case a ์—์„œ๋Š” ๋‘์กฐ๊ฑด์ด ์ž‘์—… ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๋„๋ก ๋™์ž‘ํ–ˆ๋‹ค.
  • case b ์—๋Š” dept_no๊ฐ€ ํ•„ํ„ฐ๋ง์—ญํ• ๋งŒ ํ–ˆ๋‹ค.

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

์ธ๋ฑ์Šค์˜ ๊ฐ€์šฉ์„ฑ

  • ํ•ญ์ƒ ์™ผ์ชฝ ๋ฒ”์œ„ ์ •๋ ฌ์„ ์—ผ๋‘์— ๋‘ฌ์•ผํ•œ๋‹ค.
  • %like vs like% : ํ›„์ž๋งŒ ์ธ๋ฑ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ด์šฉํ•œ๋‹ค.
  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ผ€์ด์Šค a์—์„œ ๋งŒ์•ฝ ๊ทธ๋ƒฅ dept_no๋ฅผ ์•ˆ์คฌ๋‹ค๋ฉด ์ง์ „์˜ ์˜ˆ์‹œ์™€ ๋˜‘๊ฐ™๋‹ค.

๊ฐ€์šฉ์„ฑ๊ณผ ํšจ์œจ์„ฑ ํŒ๋‹จ

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ž˜์˜ ์กฐ๊ฑด์—์„œ๋Š” ์ž‘์—… ๋ฒ”์œ„ ์กฐ๊ฑด์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์—†๋‹ค
    • NOT-EQUAL๋กœ ๋น„๊ต๋œ ๊ฒฝ์šฐ <>, not in, is not null
    • like ์•ž์˜ %
    • ์Šคํ† ์–ด๋“œ ํ•จ์ˆ˜๋‚˜ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๋กœ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์ด ๋ณ€ํ˜•๋œ ํ›„ ๋น„๊ต๋œ ๊ฒฝ์šฐ
    • ๋น„๊ฒฐ์ •์  ํ•จ์ˆ˜๊ฐ€ ๋น„๊ต์กฐ๊ฑด์— ์‚ฌ์šฉ๋œ๊ฒฝ์šฐ
    • ๋ฐ์ดํ„ฐํƒ€์ž…์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋น„๊ต
    • ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์ฝœ๋ ˆ์ด์…˜์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ

ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค

  • pk๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐ€๊นŒ์šด ์œ„์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
  • ์‚ฌ์‹ค ์ธ๋ฑ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ธฐ๋ณด๋‹ค ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ์˜ ์ €์žฅ๋ฐฉ์‹์ž„
  • ๋ ˆ์ฝ”๋“œ ์ €์žฅ์ด๋‚˜ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค์˜ ๋ณ€๊ฒฝ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ, ๊ทธ๋ž˜์„œ pk๊ฐ€ ์—†์–ด๋„ ๊ธฐ์ค€์—๋”ฐ๋ผ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋ฅผ ์ •ํ•จ
  • ๊ทธ๋ž˜์„œ ํ”„๋ผ์ด๋จธ๋ฆฌํ‚ค๋ฅผ ๋…ผ๋ฆฌ์ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ
  • ์™œ๋‚˜ํ•˜๋ฉด ํ”„๋ผ์ด๋จธ๋ฆฌํ‚ค์˜ ๋ณ€๊ฒฝ์ด ์žˆ์„๋•Œ๋งˆ๋‹ค ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ชจ๋“  ์ธ๋ฑ์Šค์˜ ๋ฌผ๋ฆฌ์  ์ฃผ์†Œ๋ฅผ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
  • ๊ทธ๋ž˜์„œ ์ปค๋ฒ„๋ง์ธ๋ฑ์Šค๋ฅผ ์กฐ๊ธˆ ๋” ์ž˜ ํ™œ์šฉํ•ด์•ผํ•จ
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์žฅ๋‹จ์  ์š”์•ฝ์€ ์ฝ๊ธฐ์—์„œ ๊ฑฐ์˜ ๋“์„ ๋ณด์ง€๋งŒ ์“ฐ๊ธฐ์—์„œ ์‹ค์ด ์žˆ๋Š” ๊ตฌ์กฐ๋ผ ์˜จ๋ผ์ธ์„œ๋น„์Šค์— ๋” ์ ํ•ฉ
  • ์•„ ์ง„์งœ ๋งˆ์ง€๋ง‰์œผ๋กœ, ๊ทธ๋ž˜์„œ snowflake๊ฐ™์€๊ฑธ ์จ์ฃผ๋ฉด ์ข‹์Œ (snowflake์˜ ์ƒ์„ฑ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ unique)
๊ตฌ๋ถ„ ์žฅ์  ๋‹จ์  ์œ ์˜ํ•  ์ 
์Šคํ† ๋ฆฌ์ง€ ๊ตฌ์กฐ ๋ฐ์ดํ„ฐ๊ฐ€ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค ์ˆœ์„œ ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด ๋ฒ”์œ„ ์กฐํšŒ(RANGE SCAN)๊ฐ€ ๋น ๋ฆ„ PK๊ฐ€ ๋žœ๋คํ•œ ๊ฐ’(UUID ๋“ฑ)์ผ ๊ฒฝ์šฐ, ํŽ˜์ด์ง€ ๋ถ„ํ• (Page Split) ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋ฅผ AUTO_INCREMENT๋กœ ์„ค์ •ํ•˜๋ฉด ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€๋Šฅ
์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค๊ฐ€ PK๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ธ๋ฑ์Šค ๋ฃจํ”„ ์กฐ์ธ(INDEX NESTED LOOP JOIN) ์ตœ์ ํ™” ๊ฐ€๋Šฅ ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง (PK๊ฐ€ ๊ธธ๋ฉด ๋ชจ๋“  ์ธ๋ฑ์Šค ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€) ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋ฅผ ์งง๊ณ  ์ •์ˆ˜ ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌ
SELECT ์„ฑ๋Šฅ PK ๊ธฐ๋ฐ˜ ์กฐํšŒ๊ฐ€ ๋งค์šฐ ๋น ๋ฆ„ (B+Tree ๊ตฌ์กฐ์˜ ์ด์ ) ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค ์กฐํšŒ ์‹œ PK๋ฅผ ์ถ”๊ฐ€ ์กฐํšŒํ•ด์•ผ ํ•˜๋ฏ€๋กœ (์ธ๋ฑ์Šค -> PK ์กฐํšŒ) ์†๋„๊ฐ€ ๋‹ค์†Œ ๋А๋ ค์ง ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๋งŒ๋“ค๋ฉด ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ
INSERT ์„ฑ๋Šฅ PK ์ˆœ์„œ๋Œ€๋กœ ์‚ฝ์ž…ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ข‹์Œ (INSERT ์‹œ ์ •๋ ฌ ๋ถ€๋‹ด ์ ์Œ) PK ๊ฐ’์ด ๋žœ๋คํ•˜๋ฉด Page Split ๋ฐœ์ƒ์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ ์ €ํ•˜ ๋žœ๋คํ•œ PK(UUID)๋ณด๋‹ค AUTO_INCREMENT๊ฐ€ ์„ฑ๋Šฅ์ƒ ์œ ๋ฆฌ
UPDATE ์„ฑ๋Šฅ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋Š” ๋ถˆ๋ณ€(Immutable)์œผ๋กœ ์„ค๊ณ„ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ข‹์Œ PK๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๊ฐ€ ์‚ญ์ œ ํ›„ ์žฌ์‚ฝ์ž…๋จ (์ฆ‰, ๋น„์šฉ์ด ๋งค์šฐ ํผ) PK๋Š” ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”
DELETE ์„ฑ๋Šฅ PK ๊ธฐ๋ฐ˜ ์‚ญ์ œ๋Š” ๋น ๋ฆ„ (B+Tree ๊ตฌ์กฐ ํ™œ์šฉ) ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์œผ๋ฉด ์‚ญ์ œ ์‹œ๋งˆ๋‹ค ์ •๋ฆฌ ๋น„์šฉ(๋ฆฌํ”„ ๋…ธ๋“œ ์‚ญ์ œ)์ด ํผ ๋ถˆํ•„์š”ํ•œ ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค

๋” ์„ฑ๋Šฅ์ด ์ข‹์ง€๋Š” ์•Š๋‹ค, ์“ฐ๊ธฐ์„ฑ๋Šฅ์€ ์‚ด๋ฒŒํ•˜๊ณ 

์™ธ๋ž˜ํ‚ค

๋ถ€๋ชจ ํ…Œ์ด๋ธ”(PK ํ…Œ์ด๋ธ”) ๋ณ€๊ฒฝ ์‹œ

  • INSERT: ์ž์‹ ํ…Œ์ด๋ธ”์—์„œ ์ฐธ์กฐํ•˜๋Š” PK๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ํ•ด๋‹น PK์— ๋Œ€ํ•ด S(๊ณต์œ ) ๋ฝ์ด ๊ฑธ๋ฆผ.
  • UPDATE: ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค(PK)๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด, ์ž์‹ ํ…Œ์ด๋ธ”์ด ์ด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— X(๋ฐฐํƒ€์ ) ๋ฝ์ด ๋ฐœ์ƒํ•จ.
  • DELETE: ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ PK๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ์ž์‹ ํ…Œ์ด๋ธ”์˜ FK๊ฐ€ ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ X(๋ฐฐํƒ€์ ) ๋ฝ์ด ๋ฐœ์ƒ.

์ž์‹ ํ…Œ์ด๋ธ”(FK ํ…Œ์ด๋ธ”) ๋ณ€๊ฒฝ ์‹œ

  • INSERT: ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š” PK๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์—์„œ ํ•ด๋‹น PK์— ๋Œ€ํ•ด S(๊ณต์œ ) ๋ฝ์ด ๋ฐœ์ƒ.
  • UPDATE: ์ž์‹ ํ…Œ์ด๋ธ”์˜ FK ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ, ๊ธฐ์กด ๋ฐ ์ƒˆ๋กœ์šด FK ๊ฐ’์ด ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์— S(๊ณต์œ ) ๋ฝ์ด ๋ฐœ์ƒ.
  • DELETE: ์ž์‹ ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฝ์„ ์œ ๋ฐœํ•˜์ง€ ์•Š์ง€๋งŒ, ON DELETE CASCADE ์„ค์ •์ด ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์—๋„ X(๋ฐฐํƒ€์ ) ๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.

์˜ตํ‹ฐ๋งˆ์ด์ €์™€ ํžŒํŠธ


๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๋‹ค์–‘ํ•˜๋‹ค. ์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ค‘์—์„œ ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์ตœ์ ์ด๊ณ  ์ตœ์†Œ์˜ ๋น„์šฉ์ด ์†Œ๋ชจ๋ ์ง€ ๊ฒฐ์ •ํ•ด์•ผํ•œ๋‹ค. (๋™์ผํ•œ ๊ฒฐ๊ณผ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ค‘์—์„œ์˜ ์ตœ์ ํ™”๊ฐ€ ์˜ตํ‹ฐ๋งˆ์ด์ €)

๊ฐœ์š”

์ฟผ๋ฆฌ ์‹คํ–‰ ์ ˆ์ฐจ

  • ์ฒซ ๋‹จ๊ณ„ : ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์š”์ฒญ๋œ SQL ๋ฌธ์žฅ์„ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ MySQL ์„œ๋ฒ„๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์œผ๋กœ ๋ถ„๋ฆฌ (parse tree) ํ•œ๋‹ค.
    • ๋ฌธ๋ฒ•์ ์œผ๋กœ ์ž˜๋ชป๋์œผ๋ฉด ์—ฌ๊ธฐ์„œ ๊ฑธ๋Ÿฌ์ง
    • MySQL ์„œ๋ฒ„๋Š” ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • ๋‘๋ฒˆ์งธ ๋‹จ๊ณ„ : SQL์˜ ํŒŒ์‹ฑ ์ •๋ณด (ํŒŒ์Šค ํŠธ๋ฆฌ)๋ฅผ ํ™•์ธํ•˜๋ฉด์„œ ์–ด๋–ค ํ…Œ์ด๋ธ”๋ถ€ํ„ฐ ์ฝ๊ณ  ์–ด๋–ค ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ํ…Œ์ด๋ธ”์„ ์ฝ์„์ง€ ์„ ํƒํ•œ๋‹ค.
    • ๋ถˆํ•„์š”ํ•œ ์กฐ๊ฑด์ œ๊ฑฐํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ๋‹จ์ˆœํ™”ํ•œ๋‹ค.
    • ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ์กฐ์ธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ์ˆœ์„œ๋กœ ์ฝ์„์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
    • ๊ฐ ํ…Œ์ด๋ธ”์— ์‚ฌ์šฉ๋œ ์กฐ๊ฑด๊ณผ ์ธ๋ฑ์Šค ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉํ•  ์ธ๋ฑ์Šค๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
    • ๊ฐ€์ ธ์˜จ ๋ ˆ์ฝ”๋“œ๋“ค์„ ์ž„์‹œ ํ…Œ์ด๋ธ”์— ๋„ฃ๊ณ  ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ€๊ณตํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
  • ์„ธ๋ฒˆ์งธ ๋‹จ๊ณ„ : ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ ๊ฒฐ์ •๋œ ํ…Œ์ด๋ธ”์˜ ์ฝ๊ธฐ ์ˆœ์„œ๋‚˜ ์„ ํƒ๋œ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ์ข…๋ฅ˜

  • CBO (Cost Based Optimizer) : ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค๊ณ  ๊ฐ ๋‹จ์œ„์ž‘์—…์˜ ๋น„์šฉ์ •๋ณด์™€ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์˜ˆ์ธก๋œ ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์‹คํ–‰๊ณ„ํš๋ณ„ ๋น„์šฉ์„ ์‚ฐ์ถœํ•œ๋‹ค.
  • RBO (Rule Based Optimizer) : ๊ทธ๋ƒฅ ์˜ตํ‹ฐ๋งˆ์ด์ €์— ๋‚ด์žฅ๋œ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์‹คํ–‰ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•œ๋‹ค. ๋‹ค๋งŒ ์š”์ฆ˜์€ ๊ฑฐ์˜ CBO๋ฅผ ์ด์šฉํ•œ๋‹ค. ์ธ๋ฑ์Šค๋‚˜ ํ…Œ์ด๋ธ”์˜ ํ†ต๊ณ„์ •๋ณด๊ฐ€ ์—†๊ณ  CPU์—ฐ์‚ฐ์ด ๋А๋ฆฌ๋˜ ์‹œ์ ˆ์— ์‚ฌ์šฉํ–ˆ์—ˆ์

๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”๊ณผ ํ’€ ์ธ๋ฑ์Šค ์Šค์บ”

  • ํ’€ํ…Œ์ด๋ธ” ์Šค์บ”์€ ๋ง ๊ทธ๋Œ€๋กœ ํ…Œ์ด๋ธ”์˜ ํ…Œ์ดํ„ฐ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ์–ด์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒƒ
  • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํ’€ํ…Œ์ด๋ธ” ์„ ํƒ์„ ์„ ํƒํ•˜๋Š”๊ฒฝ์šฐ
    • ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ์ž‘์•„์„œ ์ธ๋ฑ์Šค๋ณด๋‹ค ํ’€ํ…Œ์ด๋ธ”์Šค์บ”์ด ๋น ๋ฅธ๊ฒฝ์šฐ (ํŽ˜์ด์ง€ 1๊ฐœ๋กœ ๊ตฌ์„ฑ๋œ๊ฒฝ์šฐ)
    • where์ ˆ์ด๋‚˜ on์ ˆ์— ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ์กฐ๊ฑด์ด ์—†๋Š” ๊ฒฝ์šฐ
    • ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฟผ๋ฆฌ๋ผ๊ณ  ํ•˜๋”๋ผ๋„ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํŒ๋‹จํ•œ ์กฐ๊ฑด ์ผ์น˜ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒฝ์šฐ (์ธ๋ฑ์Šค b-tree๋ฅผ ์ƒ˜ํ”Œ๋งํ•ด์„œ ์กฐ์‚ฌํ•œ ํ†ต๊ณ„์ •๋ณด ๊ธฐ์ค€)
  • ๋ฆฌ๋“œ ์–ดํ—ค๋“œ(read ahead)๊ฐ€ ์ผ์–ด๋‚จ
    • ํฌ์–ด๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ฝ๋‹ค๊ฐ€, ์ฝ๋Š” ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์— ์–‘๋„ํ•˜๋Š”์ผ
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋””ํดํŠธ๋กœ ๋ฆฌ๋“œ์–ดํ—ค๋“œ ์„ค์ •์„ ์“ฐ์ง€๋งŒ, ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์˜ต์…˜์„ ๋” ๋‚ฎ์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์„œ ๋ฆฌ๋“œ์–ดํ—ค๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์œ ๋ฐœํ•˜๋Š”๊ฒŒ ๋‚˜์€ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. (์• ์ดˆ์— ์‹œํ€€์…œ ์Šค์บ”์ด ๋งŽ๊ณ , ๋ฐฑ๊ทธ๋ผ์šด๋“œ๊ฐ€ ๋นจ๋ฆฌ ์ฒ˜๋ฆฌํ•ด๋†“๋Š”๊ฒŒ ๋‚ซ๊ธฐ ๋•Œ๋ฌธ์—)
  • ํ’€ ์ธ๋ฑ์Šค ์Šค์บ”์€ ์ง‘๊ณ„์ฟผ๋ฆฌ๋“ฑ์—์„œ ์ž์ฃผ ์ผ์–ด๋‚จ
    • ๋ ˆ์ฝ”๋“œ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š” ์—†๊ณ  ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์••๋„์ ์œผ๋กœ ์ ์–ด์„œ ์œ ๋ฆฌ

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๋ฅผ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š”๊ฑธ ์ด์•ผ๊ธฐํ•œ๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ๊ฐ์˜ ์ฟผ๋ฆฌ๋Š” ์›๋ž˜๋„ ๋์—ˆ๋‹ค.

set session innodb_parallel_read_threads=1;
set count(*) from salaries;
1 row in set (0.32 sec)

set session innodb_parallel_read_threads=2;
set count(*) from salaries;
1 row in set (0.20 sec)

set session innodb_parallel_read_threads=3;
set count(*) from salaries;
1 row in set (0.13 sec)

Order by ์ฒ˜๋ฆฌ (Using filesort)

  • ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณ„๋„์˜ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•˜๋Š”๊ฒƒ
  • ๋ ˆ์ฝ”๋“œ ํฌ๊ธฐ์— ๋น„๋ก€ํ•ด์„œ ์ฟผ๋ฆฌ์˜ ์†๋„๊ฐ€ ์ค„์–ด๋“ ๋‹ค
  • ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ฃผ๋กœ ์‚ฌ์šฉ
    • ์ •๋ ฌ๊ธฐ์ค€์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์š”๊ฑด๋ณ„๋กœ ๋ชจ๋‘ ์ธ๋ฑ์Šค ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ๊ฒฝ์šฐ
    • group by์˜ ๊ฒฐ๊ณผ ๋˜๋Š” distict ๊ฐ™์€ ์ฒ˜๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•ด์•ผํ•˜๋Š”๊ฒฝ์šฐ
    • Union์˜ ๊ฒฐ๊ณผ ๊ฐ™์ด ์ž„์‹œ ํ…Œ์ด๋ธ”์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ •๋ ฌํ•ด์•ผํ•˜๋Š”๊ฒฝ์šฐ
    • ๋žœ๋คํ•˜๊ฒŒ ๊ฒฐ๊ณผ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•˜๋Š” ๊ฒฝ์šฐ

์†ŒํŠธ ๋ฒ„ํผ

  • ๋ฉ”๋ชจ๋ฆฌ๋‚ด์—์„œ ์ •๋ ฌํ•˜๋Š”๋ฐ ์“ฐ์ด๋Š” ๋ฒ„ํผ
  • ๋ฌธ์ œ๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด disk i/o๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์„ฑ๋Šฅ์ด ํ˜„์ €ํžˆ ์ค„์–ด๋“ ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Š˜๋ฆฌ๋Š”๊ฑด ๋ถ€์ž‘์šฉ์ด ๋„ˆ๋ฌด ์ปค์„œ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ฒฐ์ •ํ•ด์•ผํ•œ๋‹ค. (์ „์ฒด์ ์ธ ์„œ๋ฒ„ํ’€์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์ธ๊ฒฝ์šฐ ์ข…๋ฃŒ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค 1์ˆœ์œ„)

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ํฌ๊ฒŒ๋Š” ํˆฌํŒจ์Šค์™€ ์‹ฑ๊ธ€ํŒจ์Šค๊ฐ€ ์žˆ๋‹ค.
  • ๋ ˆ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์†ŒํŠธ๋ฒ„ํผ์— ๋‹ด์œผ๋ฉด ์‹ฑ๊ธ€ํŒจ์Šค, ์ •๋ ฌ ๊ธฐ์ค€ ์นผ๋Ÿผ์„ ๋ถ„๋ฆฌํ•˜๋ฉด ํˆฌํŒจ์Šค

Single Pass Sort

  • ๋ง ๊ทธ๋Œ€๋กœ ์ฟผ๋ฆฌ ์š”์ฒญ์˜ ๋ชจ๋“  ์นผ๋Ÿผ์„ ๋ฒ„ํผ์— ๋‹ด๊ณ , ๊ทธ ๋ฒ„ํผ๋ฅผ ์ •๋ ฌ์‹œํ‚จ๋’ค ๋ฐ˜ํ™˜

Two Pass Sort

  • ์ •๋ ฌ ๋Œ€์ƒ ์นผ๋Ÿผ๊ณผ ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค ๊ฐ’๋งŒ ์†ŒํŠธ ๋ฒ„ํผ์— ๋‹ด์•„์„œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ •๋ ฌ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋‹ค์‹œ ํ”„๋ผ์ด๋จธ๋ฆฌํ‚ค๋กœ select

  • ์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š” ๋ณดํ†ต์€ Single Pass ๋ฅผ ์ด์šฉํ•˜์ง€๋งŒ, ๊ฒฝ์šฐ์—๋”ฐ๋ผ Two Pass๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

    • ๋ ˆ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ์‹œ์Šคํ…œ ๋ณ€์ˆ˜์— ์„ค์ •๋œ ์†ŒํŠธํ•  ๋Œ€์ƒ ๋ ˆ์ฝ”๋“œ ๊ฐ’๋ณด๋‹ค ํด ๋•Œ
    • BLOB or Text Type Comlumn์ด Select ๋Œ€์ƒ์— ํฌํ•จ๋  ๋•Œ
    • ๊ทธ ์™ธ์—๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ ˆ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก Two Pass Sort๊ฐ€ ๋น ๋ฅด๋‹ค. (๋‹ค๋งŒ ํฐ ๊ฒฝ์šฐ๋Š” ์ธ๋ฑ์Šค๋ฅผ ํƒœ์šธ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋ ‡๊ฒŒ ์ด์•ผ๊ธฐ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค)

์ •๋ ฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

  • ์ฟผ๋ฆฌ์— order by๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ์„ธ๊ฐœ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋œ๋‹ค.
    • ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ : (extra column์—) ๋ณ„๋„ ํ‘œ๊ธฐ ์—†์Œ
    • ์กฐ์ธ์—์„œ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌ : (extra column์—) “Using filesort”
    • ์กฐ์ธ์—์„œ ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ž„์‹œ ํ…Œ์ด๋ธ”๋กœ ์ €์žฅ ํ›„ ์ •๋ ฌ : (extra column์—) “Using temporary; Using filesort”
  • ๋งŒ์•ฝ ์กฐ์ธ์ด ๋‚€๋‹ค๋ฉด
    • ์กฐ์ธ์˜ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌํ•œ ๋‹ค์Œ ์กฐ์ธ ์ˆ˜ํ–‰
    • ์กฐ์ธ์ด ๋๋‚˜๊ณ  ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์˜จ ํ›„ ์ •๋ ฌ์„ ์ˆ˜ํ–‰
  • ๋‹น์—ฐํ•˜์ง€๋งŒ, ์ „์ž๊ฐ€ ํ›จ์”ฌ ๊ณต๊ฐ„ํšจ์œจ์„ฑ์ด ๋†’๊ธฐ๋•Œ๋ฌธ์— ์ „์ž๋ฅผ ๋จผ์ € ๊ณ ๋ คํ•  ๊ฒƒ์ด๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ

  • ๋ฐ˜๋“œ์‹œ order by์— ๋ช…์‹œ๋œ ์นผ๋Ÿผ์ด ์ œ์ผ ๋จผ์ € ์ฝ๋Š” ํ…Œ์ด๋ธ”์— ์†ํ•˜๊ณ , order by ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑ๋œ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์–ด์•ผํ•จ.
  • ๋˜ํ•œ where์ ˆ์— ์ฒซ ๋ฒˆ์งธ๋กœ ์ฝ๋Š” ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ์— ๋Œ€ํ•œ ์กฐ๊ฑด์ด ์žˆ๋‹ค๋ฉด ๊ทธ ์กฐ๊ฑด๊ณผ orderby๋Š” ๊ฐ™์€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์ด ์กฐ์ธ๋˜๋Š” ๊ฒฝ์šฐ ๋„ค์Šคํ‹ฐ๋“œ ๋ฃจํ”„ ๋ฐฉ์‹์˜ ์กฐ์ธ์—์„œ๋งŒ ์ด ๋ฐฉ์‹์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ์—”์ง„์—์„œ ๋ณ„๋„์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค ์ •๋ ฌ๋œ ์ธ๋ฑ์Šค๋Œ€๋กœ ์ฝ์–ด์˜จ๋‹ค.
CREATE TABLE customers (
ย  ย  customer_id INT PRIMARY KEY,
ย  ย  customer_name VARCHAR(100)
);

  

CREATE TABLE orders (
ย  ย  order_id INT PRIMARY KEY,
ย  ย  customer_id INT,
ย  ย  order_date DATE,
ย  ย  amount DECIMAL(10, 2),
ย  ย  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

CREATE INDEX idx_orders_order_date ON orders(order_date);

EXPLAIN ANALYZE
SELECT o.order_id, o.order_date, c.customer_name, o.amount
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_date >= '2024-02-02'
ORDER BY o.order_date;

-- Index Scan using idx_orders_order_date on orders o
  -- Index Cond: (order_date >= '2024-02-02')
  -- -> Nested Loop Join with customers c
     -- Filter: o.customer_id = c.customer_id

SELECT o.order_id, o.order_date, c.customer_name, o.amount
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_date >= '2024-02-02'
ORDER BY c.customer_name; -- Warn : customers ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์œผ๋กœ ์ •๋ ฌ

์กฐ์ธ์—์„œ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌ

SELECT *
FROM employees e, salaries s
WHERE s.emp_no=e.emp_no
AND e.emp_no BETWEEN 10002 AND 10010
ORDER BY e.last_name;
  • employees ์—์„œ e.emp_no BETWEEN 10002 AND 10010 ๋งŒ์กฑํ•˜๋Š” 9๊ฑด์„ ๊ฒ€์ƒ‰
  • ์ด ๋‹จ๊ณ„์—์„œ Filesort by last_name
  • ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๋กœ ์กฐ์ธ์„ ์ˆ˜ํ–‰

์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•œ ์ •๋ ฌ

SELECT *
FROM employees e, salaries s
WHERE s.emp_no=e.emp_no
AND e.emp_no BETWEEN 10002 AND 10010
ORDER BY s.salary;
  • employees ์—์„œ e.emp_no BETWEEN 10002 AND 10010 ๋งŒ์กฑํ•˜๋Š” 9๊ฑด์„ ๊ฒ€์ƒ‰
  • ์ด ๋‹จ๊ณ„์—์„œ Filesort๋ฅผ ํ•  ์ˆ˜ ์—†์Œ
  • ์กฐ์ธ ์ดํ›„ ์ •๋ ฌํ•ด์„œ ๋ฐ˜ํ™˜ (๋ฉ”๋ชจ๋ฆฌ๋Š” ๋งŽ์ด ๋‚ญ๋น„)

์ •๋ ฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์˜ ์„ฑ๋Šฅ ๋น„๊ต

  • ์ž˜๋ชป๋œ order by๋‚˜ group by ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ๊ฐ€ ๋А๋ ค์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ
  • ์™œ ์ฟผ๋ฆฌ์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ์ •๋ ฌ์ด๋‚˜ ๊ทธ๋ฃจํ•‘ ์ž‘์—…์ด ๋А๋ฆฌ๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ
  • ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ ์ฟผ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์„ “์ŠคํŠธ๋ฆฌ๋ฐ์ฒ˜๋ฆฌ”, “๋ฒ„ํผ๋ง์ฒ˜๋ฆฌ"๋กœ ๊ตฌ๋ถ„ํ•ด์•ผํ•œ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹

  • ๋ ˆ์ฝ”๋“œ๊ฐ€ ๊ฒ€์ƒ‰๋  ๋•Œ๋งˆ๋‹ค ๋ฐ”๋กœ๋ฐ”๋กœ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก
  • ํด๋ผ์ด์–ธํŠธ๋Š” ๊ณง๋ฐ”๋กœ ์›ํ–ˆ๋˜ ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌ๋ฐ›์Œ
  • OLTP ํ™˜๊ฒฝ์—์„œ๋Š” ์ฟผ๋ฆฌ์˜ ์ฒซ ์š”์ฒญ์—์„œ๋ถ€ํ„ฐ ์ฒซ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌ๋ฐ›๊ฒŒ๊นŒ์ง€์˜ ์‘๋‹ต์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ด์„œ ์ž์ฃผ์“ฐ์ž„
  • ์ด ๋ฐฉ์‹์—์„œ๋Š” LIMIT์ด ์ฟผ๋ฆฌ์˜ ๋น„์šฉ์„ ์ƒ๋‹นํžˆ ์ค„์—ฌ์คŒ

๋ฒ„ํผ๋ง๋ฐฉ์‹

  • ORDER BY๋‚˜ GROUP BY๊ฐ™์€ ์ฒ˜๋ฆฌ๋Š” ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ŠคํŠธ๋ฆฌ๋ฐ๋˜๋Š” ๊ฒƒ์„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
  • ์ผ๋‹จ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ์— ์ฒ˜๋ฆฌ๋ฅผํ•ด์•ผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ถฉ์กฑ๋˜๊ธฐ ๋•Œ๋ฌธ
  • ๋„คํŠธ์›Œํฌ๋กœ ์ „์†ก๋˜๋Š” ๋ ˆ์ฝ”๋“œ์˜ ๊ฑด์ˆ˜๋ฅผ ์ค„์ผ์ˆ˜๋Š” ์žˆ์œผ๋‚˜ ์„ฑ๋Šฅํ–ฅ์ƒ์—๋Š” ๋„์›€์ด ๋ณ„๋กœ ์•ˆ๋œใ„ท๋‹ค (์„œ๋ฒ„์ž‘์—… ์ธก๋ฉด์—์„œ๋Š” ๊ธฐ๋‹ค์ง€ ๋ณ€ํ™”๊ฐ€ ์—†์Œ)
  • ์•„๋ž˜๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด
    • ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ : ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹์œผ๋กœ limit ์ถฉ์กฑํ• ๋•Œ๊นŒ์ง€ ์ฝ์–ด์„œ ๊ทธ๋•Œ๊ทธ๋•Œ ๋˜์ ธ์ฃผ๋ฉด ๋œ๋‹ค.
    • ์กฐ์ธ์—์„œ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌ : limit ์˜๋ฏธ์—†์Œ, filesort ๋Œ€์ƒ์ด ๋˜๋Š” ๋ ˆ์ฝ”๋“œ๋“ค์„ ๋ถˆ๋Ÿฌ์™€ ์ •๋ ฌํ•œ๋’ค ์ž˜๋ผ์„œ ๋˜์ ธ์ค˜์•ผํ•œ๋‹ค.
    • ์กฐ์ธ์—์„œ ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ž„์‹œ ํ…Œ์ด๋ธ”๋กœ ์ €์žฅ ํ›„ ์ •๋ ฌ : ์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€
select *
from tb_test1 t1, tb_test2 t2
where t1.col1 = t2.col2
order by t1.col2
limit 10
;

-- tb_test1์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ 100๊ฑด์ด๊ณ , tb_test2์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ 1000๊ฑด (1๊ฑด์˜ tb_test1๋‹น test2์— 10๊ฑด ์กด์žฌ ๊ฐ€์ •)
  • tb_test1์ด ๋“œ๋ผ์ด๋น™ ๋˜๋Š” ๊ฒฝ์šฐ
    • (์ธ๋ฑ์Šค)์ฝ์–ด์•ผํ•  ๊ฑด์ˆ˜ : t1 - 1๊ฑด, t2 - 10๊ฑด
    • (์ธ๋ฑ์Šค)์กฐ์ธ ํšŸ์ˆ˜ 1๋ฒˆ
    • (์ธ๋ฑ์Šค)์ •๋ ฌ๋Œ€์ƒ ๊ฑด์ˆ˜ : 0๊ฑด
    • (์กฐ์ธ์˜ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌ) ์ฝ์–ด์•ผํ•  ๊ฑด์ˆ˜ : t1 - 100๊ฑด, t2-10๊ฑด
    • (์กฐ์ธ์˜ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌ) ์กฐ์ธ ํšŸ์ˆ˜ : 1๋ฒˆ
    • (์กฐ์ธ์˜ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌ) ์ •๋ ฌ ๋Œ€์ƒ ๊ฑด์ˆ˜ : 100๊ฑด (t1์˜ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜ ๋งŒํผ)
    • (์ž„์‹œ ํ…Œ์ด๋ธ” ์‚ฌ์šฉํ›„ ์ •๋ ฌ) ์ฝ์–ด์•ผํ•  ๊ฑด์ˆ˜ : t1 - 100๊ฑด, t2 - 1000๊ฑด
    • (์ž„์‹œ ํ…Œ์ด๋ธ” ์‚ฌ์šฉํ›„ ์ •๋ ฌ) ์กฐ์ธ ํšŸ์ˆ˜ : 100๋ฒˆ (t1์˜ ๋ ˆ์ปค๋“œ ๊ฑด ์ˆ˜ ๋งŒํผ)
    • (์ž„์‹œ ํ…Œ์ด๋ธ” ์‚ฌ์šฉํ›„ ์ •๋ ฌ) ์ •๋ ฌ๋Œ€์ƒ ๊ฑด์ˆ˜ : 1000๊ฑด
  • tb_test2์ด ๋“œ๋ผ์ด๋น™ ๋˜๋Š” ๊ฒฝ์šฐ
    • (์ธ๋ฑ์Šค)์ฝ์–ด์•ผํ•  ๊ฑด์ˆ˜ : t1 - 10๊ฑด, t2 - 10๊ฑด
    • (์ธ๋ฑ์Šค)์กฐ์ธ ํšŸ์ˆ˜ 10๋ฒˆ
    • (์ธ๋ฑ์Šค)์ •๋ ฌ๋Œ€์ƒ ๊ฑด์ˆ˜ : 0๊ฑด

๊ฒฐ๋ก ์€ ๊ฐ€๋Šฅํ•˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์œ ๋„ํ•˜๊ณ , ๊ทธ๊ฒŒ ์–ด๋ ต๋”๋ผ๋„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋งŒ ์ •๋ ฌํ•ด๋„ ๋˜๋„๋ก ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค.

์ •๋ ฌ ๊ด€๋ จ ์ƒํƒœ ๋ณ€์ˆ˜

๋ณ€์ˆ˜๋ช… ์„ค๋ช…
Sort_merge_passes ์ •๋ ฌ์„ ์œ„ํ•ด ๋ณ‘ํ•ฉ์ด ์ˆ˜ํ–‰๋œ ํšŸ์ˆ˜
Sort_range ORDER BY๊ฐ€ ๋ฒ”์œ„ ์Šค์บ”์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ๋œ ํšŸ์ˆ˜
Sort_rows ์ •๋ ฌ์„ ์œ„ํ•ด ์ฒ˜๋ฆฌ๋œ ์ด ํ–‰ ์ˆ˜
Sort_scan ORDER BY๊ฐ€ ์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ”์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ๋œ ํšŸ์ˆ˜

Group by ์ฒ˜๋ฆฌ

Group by ๋˜ํ•œ, order by์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ๊ฐ€ ์ŠคํŠธ๋ฆฌ๋ฐ๋œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์—†๊ฒŒํ•จ group by์— ์‚ฌ์šฉ๋œ ์กฐ๊ฑด์„ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ having์ ˆ์„ ํŠœ๋‹ํ•˜๋ ค๊ณ  ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํ•  ํ•„์š”๋Š” ์—†์Œ

์ธ๋ฑ์Šค ์Šค์บ”์„ ์ด์šฉํ•˜๋Š” group by (ํƒ€์ดํŠธ ์ธ๋ฑ์Šค ์Šค์บ”)

  • ์กฐ์ธ์˜ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์— ์†ํ•œ ์นผ๋Ÿผ๋งŒ ์ด์šฉํ•ด ๊ทธ๋ฃจํ•‘ ํ•  ๋•Œ group by ์นผ๋Ÿผ์œผ๋กœ ์ด๋ฏธ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ์œผ๋ฉด์„œ ๊ทธ๋ฃจํ•‘ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋กœ ์กฐ์ธ์„ ์ฒ˜๋ฆฌํ•จ
  • ๋ฌผ๋ก  ์ง‘๊ณ„ํ•จ์ˆ˜๋“ฑ์„ ์“ฐ๋ฉด์„œ ์ž„์‹œ ํ…Œ์ด๋ธ”์ด ํ•„์š” ํ•  ์ˆ˜ ์žˆ๊ธด ํ•จ

๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”์„ ์ด์šฉํ•˜๋Š” group by

  • GROUP BY ์—ฐ์‚ฐ ์‹œ ์ผ๋ถ€ ์ธ๋ฑ์Šค ํ‚ค๋งŒ ์ฝ๊ณ , ๋‚˜๋จธ์ง€ ํ–‰์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ๋ฐฉ์‹
  • GROUP BY ๋Œ€์ƒ ์ปฌ๋Ÿผ์ด ์ธ๋ฑ์Šค์˜ ์„ ๋‘(prefix) ๋ถ€๋ถ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ย 
-- min, max ์ด์™ธ์˜ ์ง‘ํ•ฉ ํ•จ์ˆ˜ ์‚ฌ์šฉ์‹œ ๋ฃจ์Šค์ธ๋ฑ์Šค ์•ˆํƒ
select col1, sum(col2) from test group by col1;

-- group by์— ์‚ฌ์šฉ๋œ ์นผ๋Ÿผ์ด ์ธ๋ฑ์Šค ๊ตฌ์„ฑ ์นผ๋Ÿผ์˜ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ๋ถˆ๊ฐ€
select col1, col2 from test group by col2, col3;

-- select์ ˆ์˜ ์นผ๋Ÿผ์ด group by์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ๋ถˆ๊ฐ€
select col1, col3 from test group by col1, col2;
๋น„๊ต ํ•ญ๋ชฉ ํƒ€์ดํŠธ ์ธ๋ฑ์Šค ์Šค์บ” ๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”
์ฒ˜๋ฆฌ ๋ฐฉ์‹ย  ย  ย  ย  ย  ย  ๋ชจ๋“  ์ธ๋ฑ์Šค๋ฅผ ์ฝ์Œ ์ผ๋ถ€ ์ธ๋ฑ์Šค๋งŒ ์ฝ์Œ
์„ฑ๋Šฅ ย  ย  ย  ย  ย  ย  ย  ย  ๋ณดํ†ต ๋น ๋ฆ„ ๋” ๋น ๋ฆ„
์ ์šฉ ๊ฐ€๋Šฅ ํ•จ์ˆ˜ ย  ย  ย  COUNT() ๊ฐ€๋Šฅ MIN(), MAX() ๊ฐ€๋Šฅ
WHERE ์ ˆ ํ•„์š” ์—ฌ๋ถ€ ย  ํ•„์š” ์—†์Œ WHERE๊ฐ€ ์žˆ์œผ๋ฉด ๋” ํšจ๊ณผ์ 
FileSort ์‚ฌ์šฉ ์—ฌ๋ถ€ ย  ์‚ฌ์šฉ ์•ˆ ํ•จ ์‚ฌ์šฉ ์•ˆ ํ•จ

์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š” group by

  • GROUP BY ๋Œ€์ƒ ์ปฌ๋Ÿผ์ด ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•  ๋•Œ ย 
  • GROUP BY์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ปฌ๋Ÿผ์„ SELECT ํ•  ๋•Œ (Loose Index Scan ์ ์šฉ ๋ถˆ๊ฐ€) ย 
  • ORDER BY๊ฐ€ GROUP BY์™€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ย 
  • HAVING ์ ˆ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ย 

Distinct ์ฒ˜๋ฆฌ

ํŠน์ • ์นผ๋Ÿผ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’๋งŒ ์กฐํšŒํ•˜๋ ค๋ฉด distinct๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. distinct๋Š” min, max ๋˜๋Š” count๊ฐ™์€ ์ง‘ํ•ฉํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š”๊ฒฝ์šฐ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง‘ํ•ฉํ•จ์ˆ˜์™€ ๊ฐ™์ด distinct๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ณ„ํš์—์„œ distinct์ฒ˜๋ฆฌ๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•  ๋•Œ ํ•ญ์ƒ ์ž„์‹œ ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•˜๋‹ค. (์‹คํ–‰๊ณ„ํš์˜ extra column์—์„œ๋Š” using temporary๊ฐ€ ์ถœ๋ ฅ๋˜์ง„ ์•Š๋Š”๋‹ค.)

select distinct …

-- 8.0 ์ด์ƒ์—์„œ๋Š” group by ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ์— orderby์ ˆ์ด ์—†์œผ๋ฉด ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, 
-- ๋‹ค์Œ์˜ ๋‘ ์ฟผ๋ฆฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
select distinct emp_no from salaries;
select emp_no from salaries group by emp_no;

์ง‘ํ•ฉ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ distinct

  • ์ง‘ํ•ฉ ํ•จ์ˆ˜๊ฐ€ ์—†๋Š” select์ฟผ๋ฆฌ์—์„œ distinct๋Š” ์กฐํšŒํ•˜๋Š” ๋ชจ๋“  ์นผ๋Ÿผ์˜ ‘์กฐํ•ฉ์ด’ ์œ ๋‹ˆํฌํ•œ ๊ฒƒ๋“ค๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ง‘ํ•ฉํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉ๋œ distinct๋Š” ๊ทธ ์ง‘ํ•ฉ ํ•จ์ˆ˜์˜ ‘์ธ์ž๋กœ ์ „๋‹ฌ๋œ ์นผ๋Ÿผ๊ฐ’์ด ์œ ๋‹ˆํฌํ•œ ๊ฒƒ๋“ค’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
id department role salary
1 HR Manager 60000
2 HR Staff 50000
3 HR Staff 50000
4 IT Engineer 70000
5 IT Engineer 75000
DISTINCT ์‚ฌ์šฉ ๋ฐฉ์‹ ๋™์ž‘ ๋ฐฉ์‹ ์˜ˆ์ œ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์˜ˆ์‹œ
์ง‘ํ•ฉ ํ•จ์ˆ˜ ์—†์ด ์‚ฌ์šฉ ์กฐํšŒํ•˜๋Š” ๋ชจ๋“  ์ปฌ๋Ÿผ์˜ ์กฐํ•ฉ์ด ์œ ๋‹ˆํฌํ•œ ๊ฐ’๋“ค๋งŒ ๋ฐ˜ํ™˜ SELECT DISTINCT department, role FROM employees; HR, Manager
HR, Staff
IT, Engineer
์ง‘ํ•ฉ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ์ปฌ๋Ÿผ์—์„œ ์œ ๋‹ˆํฌํ•œ ๊ฐ’๋“ค๋งŒ ๊ณ ๋ คํ•˜์—ฌ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ SELECT COUNT(DISTINCT department) FROM employees; 2
SUM(DISTINCT salary) salary ์ปฌ๋Ÿผ์˜ ๊ณ ์œ ํ•œ ๊ฐ’๋“ค๋งŒ ํ•ฉ์‚ฐ SELECT SUM(DISTINCT salary) FROM employees; 255000
-- ์ฟผ๋ฆฌ A
select distinct first_name, last_name
from employees
where emp_no between 10001 and 10200;

-- ์ฟผ๋ฆฌ B
select distinct count(distinct first_name), count(distinct last_name)
from employees
where emp_no between 10001 and 10200;

-- ์ฟผ๋ฆฌ C
select count(distinct first_name, last_name)
from employees
where emp_no between 10001 and 10200;
์ฟผ๋ฆฌ ๋‚ด๋ถ€ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐฉ์‹ ์ •๋ ฌ ๋ฐ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์ฒ˜๋ฆฌ ๋ฐฉ์‹
์ฟผ๋ฆฌ A first_name, last_name์„ ํฌํ•จํ•˜๋Š” ์ž„์‹œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ first_name, last_name์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ค‘๋ณต ์ œ๊ฑฐ ํ…Œ์ด๋ธ”์„ ์Šค์บ”ํ•œ ํ›„ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์—ฌ ์œ ๋‹ˆํฌํ•œ (first_name, last_name) ์กฐํ•ฉ๋งŒ ๋ฐ˜ํ™˜
์ฟผ๋ฆฌ B first_name๊ณผ last_name ๊ฐ๊ฐ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’๋งŒ ์ €์žฅํ•˜๋Š” ์ž„์‹œ ํ…Œ์ด๋ธ” ๋‘ ๊ฐœ ์ƒ์„ฑ first_name๊ณผ last_name ๊ฐ๊ฐ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ first_name๊ณผ last_name์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ •๋ ฌ ํ›„ ์œ ๋‹ˆํฌํ•œ ๊ฐ’๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐ
์ฟผ๋ฆฌ C (first_name, last_name) ์กฐํ•ฉ์„ ์ €์žฅํ•˜๋Š” ๋‹จ์ผ ์ž„์‹œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ (first_name, last_name)์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ค‘๋ณต ์ œ๊ฑฐ ํ›„ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์บ”ํ•œ ํ›„ (first_name, last_name) ์กฐํ•ฉ์„ ์ค‘๋ณต ์—†์ด ์ €์žฅํ•˜๊ณ  ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐ
๋‚ด๋ถ€ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๊ด€์ ์—์„œ์˜ ์ฐจ์ด์ 
  • ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” first_name, last_name์„ ํฌํ•จํ•˜๋Š” ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ , ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” first_name๊ณผ last_name์„ ๊ฐ๊ฐ ๋‹ค๋ฃจ๋ฏ€๋กœ, ๋‚ด๋ถ€์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ๋ณ„๋„ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ ์ปฌ๋Ÿผ์—์„œ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์„ ์นด์šดํŠธํ•œ๋‹ค.
  • ์„ธ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” (first_name, last_name)์˜ ์กฐํ•ฉ์ด ์œ ๋‹ˆํฌํ•œ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋‹จ์ผ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ์กฐํ•ฉ์„ ์ •๋ ฌํ•œ ํ›„ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์—ฌ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์—ฌ๋ถ€
  • first_name, last_name์— ๊ฐœ๋ณ„ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
  • ํ•˜์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” ๋‘ ๊ฐœ์˜ ์ปฌ๋Ÿผ์„ ๋™์‹œ์— ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋‹จ์ผ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ์ตœ์ ํ™”๋˜๊ธฐ ์–ด๋ ต๊ณ , ์ •๋ ฌ(Sort) ๋˜๋Š” ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
  • (first_name, last_name) ๋ณตํ•ฉ ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ์ฒซ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๋ก 

  • ๋‹จ์ˆœํ•œ DISTINCT ์กฐํšŒ(SELECT DISTINCT first_name, last_name)๋Š” ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
  • **COUNT(DISTINCT ์ปฌ๋Ÿผ)์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ปฌ๋Ÿผ๋ณ„๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋ฉฐ, ์ธ๋ฑ์Šค๋ฅผ ๋” ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
  • ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ DISTINCT๋กœ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ๊ฒฝ์šฐ(COUNT(DISTINCT first_name, last_name))๋Š” (first_name, last_name)์„ ํ•˜๋‚˜์˜ ์กฐํ•ฉ์œผ๋กœ ์ธ์‹ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹จ์ผ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋‚ด๋ถ€ ์ž„์‹œ ํ…Œ์ด๋ธ” ํ™œ์šฉ

์ •๋ ฌ ํ˜น์€ ๊ทธ๋ฃจํ•‘ ํ•  ๋•Œ ์•”์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ด๋ธ”, ์ฆ‰ ์ง์ ‘ ๋งŒ๋“  create temporary table๊ณผ๋Š” ๋‹ค๋ฆ„ ๋””์Šคํฌ์— ์ž„์‹œํ…Œ์ด๋ธ”์ด ๋งŒ๋“ค์–ด์งˆ๋•Œ๋„ ์žˆ์Œ

disk vs memory

  • 1gb๊ฐ€ ๋„˜์œผ๋ฉด ๋””์Šคํฌ๋กœ ๋„˜๊น€
  • ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์€ mmap์œผ๋กœ ๋„˜๊ธฐ๋Š”๊ฒŒ ๊ธฐ๋ณธ ๋ณ€์ˆ˜๋กœ ์„ค์ •๋˜์–ด์žˆ์Œ

์ž„์‹œํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•œ ์ฟผ๋ฆฌ

  • order by, group by์— ๋ช…์‹œ๋œ ์นผ๋Ÿผ์ด ๋‹ค๋ฅธ ์ฟผ๋ฆฌ
  • order by, group by์— ๋ช…์‹œ๋œ ์นผ๋Ÿผ์ด ์กฐ์ธ์˜ ์ˆœ์„œ์ƒ ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ์ฟผ๋ฆฌ
  • distinct์™€ order by๊ฐ€ ๋™์‹œ์— ์ฟผ๋ฆฌ์— ์กด์žฌํ•˜๋Š”๊ฒฝ์šฐ ๋˜๋Š” distinct๊ฐ€ ์ธ๋ฑ์Šค๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•˜๋Š” ์ฟผ๋ฆฌ
  • union์ด๋‚˜ union distinct๊ฐ€ ์‚ฌ์šฉ๋œ ์ฟผ๋ฆฌ
  • ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์—์„œ select_type์ด derived์ธ ์ฟผ๋ฆฌ

๊ณ ๊ธ‰ ์ตœ์ ํ™”

์‹คํ–‰ ๊ณ„ํš

ํ†ต๊ณ„ ์ •๋ณด

  • 8.0 ๋ฒ„์ „ ์ดํ›„๋ถ€ํ„ฐ ์ธ๋ฑ์Šค๋˜์ง€ ์•Š์€ ์นผ๋Ÿผ๋“ค์— ๋Œ€ํ•ด์„œ๋„ ๋ฐ์ดํ„ฐ ๋ถ„ํฌ๋„๋ฅผ ์ˆ˜์ง‘ํ•ด์„œ ์ €์žฅํ•˜๋Š” ํžˆ์Šคํ† ๊ทธ๋žจ์ด ๋„์ž…๋๋‹ค.

ํ…Œ์ด๋ธ” ๋ฐ ์ธ๋ฑ์Šค ํ†ต๊ณ„์ •๋ณด

  • ๋น„์šฉ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ๊ฑด ํ†ต๊ณ„์ •๋ณด
  • 8.0 ์ด์ „๊นŒ์ง€๋Š” ํ†ต๊ณ„์ •๋ณด๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ถ€์ •ํ™•ํ•ด์„œ ์ด์Šˆ์˜€์Œ

MySQL ์„œ๋ฒ„์˜ ํ†ต๊ณ„ ์ •๋ณด

  • ๊ธฐ์กด์—๋Š” ํ†ต๊ณ„์ •๋ณด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์žˆ์–ด์„œ ํœ˜๋ฐœ์„ฑ์ด ์žˆ์—ˆ์Œ
  • ๊ทธ๋Ÿฌ๋‚˜ ์ตœ๊ทผ์—๋Š” ํ…Œ์ด๋ธ”๋กœ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ ์œ ์ง€
database_name table_name index_name stat_name stat_value sample_size last_update
employees employees PRIMARY n_diff_pfx01 300024 100 2025-03-01
employees employees PRIMARY n_leaf_pages 1024 NULL 2025-03-01
employees employees PRIMARY size 2048 NULL 2025-03-01
employees employees idx_lastname n_diff_pfx01 250000 100 2025-03-01
employees employees idx_lastname n_leaf_pages 512 NULL 2025-03-01
employees employees idx_lastname size 1024 NULL 2025-03-01
  • ๊ฐ ์นผ๋Ÿผ์˜ ์˜๋ฏธ
์ปฌ๋Ÿผ๋ช… ์˜๋ฏธ
database_name ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ์†ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„ (employees)
table_name ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ์†ํ•œ ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„ (employees)
index_name ํ•ด๋‹น ํ…Œ์ด๋ธ”์—์„œ ์ˆ˜์ง‘๋œ ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ์ธ๋ฑ์Šค์˜ ์ด๋ฆ„ (PRIMARY, idx_lastname ๋“ฑ)
stat_name ์ธ๋ฑ์Šค์˜ ํ†ต๊ณ„ ์ •๋ณด ํ•ญ๋ชฉ (์„ค๋ช…์€ ์•„๋ž˜ ์ฐธ๊ณ )
stat_value ํ•ด๋‹น ํ†ต๊ณ„ ํ•ญ๋ชฉ์˜ ๊ฐ’
sample_size ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•  ๋•Œ ์‚ฌ์šฉํ•œ ์ƒ˜ํ”Œ ํฌ๊ธฐ (์ผ๋ถ€ ํ†ต๊ณ„ ํ•ญ๋ชฉ์— ์ ์šฉ๋จ)
last_update ํ†ต๊ณ„ ์ •๋ณด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„
  • stat_name ํ•ญ๋ชฉ ์„ค๋ช…
stat_name ์„ค๋ช…
n_diff_pfx01 ์ธ๋ฑ์Šค์˜ ์ฒซ ๋ฒˆ์งธ ์ปฌ๋Ÿผ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์˜ ๊ฐœ์ˆ˜ (์นด๋””๋„๋ฆฌํ‹ฐ)
n_leaf_pages ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ๋ฆฌํ”„(leaf) ํŽ˜์ด์ง€ ๊ฐœ์ˆ˜ (B-ํŠธ๋ฆฌ ์ธ๋ฑ์Šค์˜ ๋ฆฌํ”„ ๋…ธ๋“œ)
size ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ์ „์ฒด ํŽ˜์ด์ง€ ์ˆ˜ (n_leaf_pages๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ)
n_rows ์ „์ฒด ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜
clustered_index_size ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค์˜ ํฌ๊ธฐ (InnoDB ํŽ˜์ด์ง€ ๊ฐœ์ˆ˜)
sum_of_other_index_size ํ”„๋ผ์ด๋จธ๋ฆฌ ํ‚ค๋ฅผ ์ œ์™ธํ•œ ์ธ๋ฑ์Šค์˜ ํฌ๊ธฐ

ํžˆ์Šคํ† ๊ทธ๋žจ

  • ๋ถ„ํฌ๋ฅผ ๋ณด๊ธฐ์œ„ํ•จ
  • ์ง์ ‘ ์ˆ˜์ง‘๋˜์ง€๋Š” ์•Š๊ณ  ๋ช…์‹œ์ ์œผ๋กœ analyze table ... update histogram์ด๋ผ๋Š” ์ฟผ๋ฆฌ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผํ•จ
  • ์ƒ˜ํ”Œ๋ง ๊ฐฏ์ˆ˜๋“ฑ์„ ์„ค์ • ๊ฐ€๋Šฅํ•จ
  • ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ’์œผ๋กœ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํžˆ์Šคํ† ๊ทธ๋žจ์„ ์ฐธ๊ณ ํ• ์ง€ ๋ง์ง€ ์ •ํ•  ์ˆ˜ ์žˆ์Œ

ํžˆ์Šคํ† ๊ทธ๋žจ์˜ ์šฉ๋„

  • ๋ฒ„ํ‚ท๋ณ„๋กœ ๋ ˆ์ฝ”๋“œ์˜ ๊ฐฏ์ˆ˜์™€, ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์ด ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ์„ฑ๋Šฅ์ ์œผ๋กœ ์œ ๋ฆฌํ•œ ์„ ํƒ์„ ํ•œ๋‹ค.
  • ์ฃผ๋กœ ์ธ๋ฑ์Šค ๋˜์ง€ ์•Š์€ ์นผ๋Ÿผ์— ๋ถ„ํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์”€

์กฐ์ธ ์ „์— ์ž‘์€ ํ…Œ์ด๋ธ”์„ ํ•„ํ„ฐ๋งํ•˜๋ฉด ๋น ๋ฆ„, ๋ถ„ํฌ๊ฐ€ 25ํผ์„ผํŠธ๊ฐ€ ๋„˜๋Š”๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด ํ’€ํ…Œ์ด๋ธ” ์Šค์บ”์ด ๋น ๋ฆ„ ๋“ฑ๋“ฑ์œผ๋กœ ์œ ๋ฆฌํ•œ ์„ ํƒ์„ ํ•œ๋‹ค๋Š” ๋œป.

ํžˆ์Šคํ† ๊ทธ๋žจ๊ณผ ์ธ๋ฑ์Šค

  • ์‚ฌ์‹ค ํ†ต๊ณ„์ •๋ณด๋งŒ ํ™œ์šฉํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ธ๋ฑ์Šค๋ฅผ ์ƒ˜ํ”Œ๋งํ•ด์„œ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ
  • ์กฐ๊ฑด์ ˆ์˜ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์œ„ํ•ด ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์‹ค์ œ ์ธ๋ฑ์Šค์˜ b-tree๋ฅผ ์ƒ˜ํ”Œ๋งํ•ด์„œ ์‚ดํŽด๋ณธ๋‹ค.
  • ์ด ์ž‘์Œ์„ Index Dive๋ผ๊ณ  ํ•จ

์ฝ”์ŠคํŠธ ๋ชจ๋ธ

  • mysql ์„œ๋ฒ„๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ํ•„์š”๋กœ ํ•œ๋‹ค.
    • ๋””์Šคํฌ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ์ฝ๊ธฐ
    • ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ์ฝ๊ธฐ
    • ์ธ๋ฑ์Šค ํ‚ค ๋น„๊ต
    • ๋ ˆ์ฝ”๋“œ ํ‰๊ฐ€
    • ๋ฉ”๋ชจ๋ฆฌ ์ž„์‹œ ํ…Œ์ด๋ธ” ์ž‘์—…
    • ๋””์Šคํฌ ์ž„์‹œ ํ…Œ์ด๋ธ” ์ž‘์—…
  • ์œ„์™€ ๊ฐ™์€ ์ž‘์—…์ด ์–ผ๋งˆ๋‚˜ ํ•„์š”ํ• ์ง€ ์˜ˆ์ธกํ•˜๊ณ  ์ „์ฒด ์ž‘์—…ใ…‚ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ตœ์ ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ์ฐพ๋Š”๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์ „์ฒด ์ฟผ๋ฆฌ์˜ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋‹จ์œ„ ์ž‘์—…๋“ค์˜ ๋น„์šฉ์„ Cost Model์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ๊ฒฐ๋ก ์ ์œผ๋กœ 8.0 ์ด์ƒ์˜ ์ฝ”์ŠคํŠธ๋ชจ๋ธ์€ ๋‹ค์Œ ๋‘๊ฐœ์˜ ์„ค์ •๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • server_cost: ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๊ณ  ๋ ˆ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•˜๊ณ  ์ž„์‹œ ํ…Œ์ด๋ธ” ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋น„์šฉ ๊ด€๋ฆฌ
    • engine_cost: ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ ๊ด€๋ฆฌ
    • ๋‘ ๊ฐ’์€ ํ…Œ์ด๋ธ”๋กœ ๊ด€๋ฆฌ๋˜๋Š”๋ฐ ๋‹ค์Œ๊ณผ๊ฐ™์€ ์นผ๋Ÿผ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
      • ์ดํ•˜ ๊ณตํ†ต
        • cost_name: ์ฝ”์ŠคํŠธ ๋ชจ๋ธ์˜ ๊ฐ ๋‹จ์œ„ ์ž‘์—…
        • default_vallue: ๊ฐ ๋‹จ์œ„ ์ž‘์—…์˜ ๋น„์šฉ
        • cost_value : dbms๊ด€๋ฆฌ์ž๊ฐ€ ์„ค์ •ํ•œ ๊ฐ’
        • last_updated : ๋‹จ์œ„ ์ž‘์—…์˜ ๋น„์šฉ์ด ๋ณ€๊ฒฝ๋œ ์‹œ์ 
        • comment : ๋น„์šฉ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์„ค๋ช…
      • ์ดํ•˜ engine_cost์—๋งŒ ์ถ”๊ฐ€์ ์œผ๋กœ ์žˆ๋Š” ์นผ๋Ÿผ
        • engine_name : ๋น„์šฉ์ด ์ ์šฉ๋œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„
        • device_type : ๋””์Šคํฌ ํƒ€์ž…
๋‹จ์œ„ ์ž‘์—… ๊ธฐ๋ณธ๊ฐ’ (Default Value) ์„ค๋ช… ์—”์ง„ ์ฝ”์ŠคํŠธ ์„œ๋ฒ„ ์ฝ”์ŠคํŠธ ๋†’์ด๋ฉด
disk_temptable_create_cost 20.0 ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๋น„์šฉ. ๋‚ด๋ถ€์ ์œผ๋กœ ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„(InnoDB ๋˜๋Š” MyISAM)์„ ์‚ฌ์šฉํ•˜๋Š” ์ž„์‹œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ ๋ฐœ์ƒ. โœ” ๋””์Šคํฌ์˜ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์‹คํ–‰๊ณ„ํš ์ˆ˜๋ฆฝ
disk_temptable_row_cost 0.5 ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ์ž„์‹œ ํ…Œ์ด๋ธ”์— ํ–‰์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋น„์šฉ. โœ” ๋””์Šคํฌ์˜ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์‹คํ–‰๊ณ„ํš ์ˆ˜๋ฆฝ
memory_temptable_create_cost 1.0 ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๋น„์šฉ. MEMORY ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ์ž„์‹œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ ๋ฐœ์ƒ. โœ” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์‹คํ–‰๊ณ„ํš ์ˆ˜๋ฆฝ
memory_temptable_row_cost 0.1 ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ ์ž„์‹œ ํ…Œ์ด๋ธ”์— ํ–‰์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋น„์šฉ. โœ” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์‹คํ–‰๊ณ„ํš ์ˆ˜๋ฆฝ
key_compare_cost 0.05 ๋ ˆ์ฝ”๋“œ ํ‚ค๋ฅผ ๋น„๊ตํ•˜๋Š” ๋น„์šฉ. ์ด ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๋งŽ์€ ํ‚ค ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ ๊ณ„ํš์˜ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•˜์—ฌ, ์ •๋ ฌ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ๊ณ„ํš์„ ์„ ํ˜ธํ•˜๊ฒŒ ๋จ. โœ” ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ์˜ ์ˆ˜ํ–‰ ๊ณ„ํš์„ ์ˆ˜๋ฆฝ
row_evaluate_cost 0.1 ๋‹จ์ผ ํ–‰์„ ํ‰๊ฐ€(๊ณ„์‚ฐ)ํ•˜๋Š” ๋น„์šฉ. โœ” ํ’€์Šค์บ”์„ ์‹คํ–‰ํ•˜๋Š” ๋น„์šฉ์ด ๋Š˜์–ด๋‚˜์„œ ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค ์Šค์บ”์„ ์‹คํ–‰ํ•˜๋„๋ก ์‹คํ–‰๊ณ„ํš ์ˆ˜๋ฆฝ
io_block_read_cost 1.0 ๋””์Šคํฌ์—์„œ ๋ธ”๋ก์„ ์ฝ๋Š” ๋น„์šฉ. โœ” ๋ฒ„ํผํ’€์—์„œ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ ๋†’์•„์ง
memory_block_read_cost 0.25 ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ธ”๋ก์„ ์ฝ๋Š” ๋น„์šฉ. โœ”
  • row_evaluate_cost : ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ๋ฐ˜ํ™˜ํ•œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ฟผ๋ฆฌ์˜ ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š”์ง€๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋‹จ์œ„ ์ž‘์—…
    • ์ด ๊ฐ’์ด ์ฆ๊ฐ€ํ• ์ˆ˜๋ก ํ’€ํ…Œ์ด๋ธ” ์Šค์บ”๊ณผ ๊ฐ™์ด ๋งŽ์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„์šฉ์ด ๋†’์•„์ง€๊ณ ,
    • ๋ฐ˜๋Œ€๋กœ ๋ ˆ์ธ์ง€ ์Šค์บ”๊ณผ ๊ฐ™์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ ์€ ์ˆ˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ๋น„์šฉ์ด ๋‚ฎ์•„์ง„๋‹ค.
  • key_compare_cost : ํ‚ค๊ฐ’์˜ ๋น„๊ต์ž‘์—…์— ํ•„์š”ํ•œ ๋น„์šฉ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, ๋ ˆ์ฝ”๋“œ ์ •๋ ฌ๊ณผ ๊ฐ™์ด ํ‚ค๊ฐ’ ๋น„๊ต ์ฒ˜๋ฆฌ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ์˜ ๋น„์šฉ์ด ๋†’์•„์ง„๋‹ค.

ํ™•์‹คํžˆ DBA์˜ ์˜์—ญ์ธ ๊ฒƒ ๊ฐ™๋‹ค

์‹คํ–‰ ๊ณ„ํš ํ™•์ธ

์‹คํ–‰ ๊ณ„ํš ์ถœ๋ ฅ ํฌ๋งท

  • FORMAT= ์œผ๋กœ ์ค„ ์ˆ˜ ์žˆ์Œ (json, tree ๋“ฑ๋“ฑ)

์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ์‹œ๊ฐ„ ํ™•์ธ

  • EXPLAIN ANALYZE๋กœ ํŠธ๋ฆฌํ˜•์‹์œผ๋กœ ๋‹จ๊ณ„๋ณ„ ์†Œ์š”์‹œ๊ฐ„์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
EXPLAIN ANALYZE
SELECT e.emp_no, AVG(s.salary)
FROM employees e
    INNER JOIN salaries s ON s.emp_no = e.emp_no
                AND s.salary > 50000
                AND s.from_date <= '1990-01-01'
                AND s.to_date > '1990-01-01'
WHERE e.first_name = 'Matt'
GROUP BY e.hire_date;

A) -> Table scan on <temporary> (actual time=0.001..0.004 rows=48 loops=1)
B)   -> Aggregate using temporary table (actual time=3.779..3.808 rows=48 loops=1)
C)     -> Nested loop inner join (cost=685.24 rows=135) (actual time=0.367..3.602 rows=48 loops=1)
D)       -> Index lookup on e using ix_firstname (first_name='Matt') (cost=215.08 rows=233) (actual time=0.348 1.046 rows=233 loops=1)
E)       -> Filter: (...where์ ˆ ํ•„ํ„ฐ๋“ค)
F)         -> Index lookup on s using primary (emp_no=e.emp_no)
  • ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๊ฐ™์€ ๋ ˆ๋ฒจ์—์„œ๋Š” ์ƒ๋‹จ์˜ ๋ผ์ธ์ด ๋จผ์ €
  • ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๋ ˆ๋ฒจ์—์„œ๋Š” ๊ฐ€์žฅ ์•ˆ์ชฝ์— ์œ„์น˜ํ•œ ๋ผ์ธ์ด ๋จผ์ €

๊ทธ๋ž˜์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ์‹คํ–‰๋œ๋‹ค

1. D) Index lookup on e using ix_firstname // employees ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด first_name=Matt์กฐ๊ฑด์˜ ๋ ˆ์ฝ”๋“œ ์ฐพ๊ธฐ
2. F) Index lookup on s using primary // salaries ํ…Œ์ด๋ธ”์˜ pk๋กœ emp_no๊ฐ€ 1๋ฒˆ ๊ฒฐ๊ณผ์˜ emp_no์™€ ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„์„œ
3. E) filter // 2๋ฒˆ์„ filterํ•˜๊ณ  ์ผ์น˜ํ•˜๋Š”๊ฐ’ ๋ฝ‘๊ธฐ
4. C) Nested  loop inner join // 1,3๋ฒˆ์˜ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ธํ•ด์„œ
5. B) aggregate using temporary table // ์ž„์‹œํ…Œ์ด๋ธ”์— ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋ฉฐ group by ์ง‘๊ณ„
6. A) table scan on <temporary> // ์ž„์‹œํ…Œ์ด๋ธ”์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

์‹คํ–‰ ๊ณ„ํš ๋ถ„์„

id์นผ๋Ÿผ

  • select๋ณ„๋กœ ๋ถ€์—ฌ๋˜๋Š” id
  • ์ ‘๊ทผ ์ˆœ์„œ๋ฅผ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Œ

select_type ์นผ๋Ÿผ

  • ๊ฐ ๋‹จ์œ„ select์ฟผ๋ฆฌ๊ฐ€ ์–ด๋–ค ํƒ€์ž…์˜ ์ฟผ๋ฆฌ์ธ์ง€ ํ‘œ์‹œ๋˜๋Š” ์นผ๋Ÿผ
  • simple : union์ด๋‚˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹จ์ˆœํ•œ select, ์ฟผ๋ฆฌ๊ฐ€ ์•„๋ฌด๋ฆฌ ๋ณต์žกํ•ด๋„ ๋‹จ ํ•˜๋‚˜(์ผ๋ฐ˜์ ์œผ๋กœ ์ œ์ผ ๋ฐ”๊นฅ)
  • primary : union์ด๋‚˜ ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๊ณ„ํš์—์„œ ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹จํ•˜๋‚˜
  • union : ์œ ๋‹ˆ์˜จ์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋‚˜๋Š” ๋‹จ์œ„ ์…€๋ ‰ํŠธ ์ฟผ๋ฆฌ ๊ฐ€์šด๋ฐ ์ฒซ ๋ฒˆ์งธ๋ฅผ ์ œ์™ธํ•œ ๋‘ ๋ฒˆ์งธ ์ดํ›„ ๋‹จ์œ„์˜ ์…€๋ ‰ํŠธ ์ฟผ๋ฆฌ์˜ ํƒ€์ž…, ์œ ๋‹ˆ์˜จ์˜ ์ฒซ๋ฒˆ์งธ ๋‹จ์œ„ ์…€๋ ‰ํŠธ์˜ ํƒ€์ž…์€ union๋˜๋Š” ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋“ค์„ ๋ชจ์•„์„œ ์ €์žฅํ•˜๋Š” ์ž„์‹œํ…Œ์ด๋ธ”(derived)๊ฐ€ select_type์œผ๋กœ ์„ค์ •๋จ
  • dependent union : union ํ˜น์€ union all๋กœ ๊ฒฐํ•ฉ๋œ ๋‹จ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์™ธ๋ถ€ ์ฟผ๋ฆฌ์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›๋Š”๊ฑธ ์˜๋ฏธ
  • union result : union๊ฒฐ๊ณผ๋ฅผ ๋‹ด๋Š” ํ…Œ์ด๋ธ” (์‹ค์ œ ์ฟผ๋ฆฌ์—์„œ ๋‹จ์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๊ธฐ์— ๋ณ„๋„์˜ id ์—†์Œ)
explain
select emp_no from salaries where salary > 100000
unionย  distinct
select emp_no from dept_emp where from_date > '2001-01-01'
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY salaries ref salary_index salary_index 4 const 100 Using where
2 UNION dept_emp range from_date_index from_date_index 3 NULL 200 Using where
NULL UNION RESULT NULL NULL NULL NULL NULL NULL NULL Using temporary
  • subquery : from์ ˆ ์ด์™ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋งŒ์„ ์˜๋ฏธ