๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์Šคํ„ฐ๋””/Real MySQL

B-Tree ์ธ๋ฑ์Šค ์ •๋ฆฌ (8.1 ~ 8.3.5)

์ธ๋ฑ์Šค๋ฅผ ๊ฑธ๋ฉด ์กฐํšŒ๊ฐ€ ์™œ ๋น ๋ฅธ์ง€์— ๋Œ€ํ•œ ์˜๋ฌธ์„ ํ•ด์†Œํ•˜๊ณ ์ž Real MySQL์„ ํ•™์Šตํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

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

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

# ๊ธฐ๊ณ„์‹ ์žฅ์น˜์ธ HDD(ํ•˜๋“œ ๋””์Šคํฌ)

๊ธฐ์กด ๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๊ณ„์‹ ์žฅ์น˜์ธ ์›ํŒ ๋ชจ์–‘์˜ HDD(ํ•˜๋“œ ๋””์Šคํฌ)์— ์ €์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

HDD๋Š” ์›ํŒ์„ ๋Œ๋ ค๊ฐ€๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋žœ๋คI/O ์ž‘์—…์€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

# ์ „์ž์‹ ์žฅ์น˜์˜ ๋“ฑ์žฅ

HDD์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ณ ์ž SSD, CPU, ๋ฉ”๋ชจ๋ฆฌ ๊ฐ™์ด ์ „๊ธฐ์  ํŠน์„ฑ์„ ๋ˆ ์ „์ž์‹ ์žฅ์น˜๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

SSD๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด HDD๋ฅผ ํšŒ์ „์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ์ž‘์—…์ด ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , DBMS๊ฐ€ ์ด SSD๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด SSD ๋„ ์ˆœ์ฐจI/O ์™€ ๋žœ๋คI/O ๊ฐ„์˜ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ์— ๋žœ๋คI/O ์ž์ฒด๋ฅผ ์ค„์—ฌ์ฃผ๋ฉด ์„ฑ๋Šฅ์ด ์ข‹์•„์ง€๋Š”๋ฐ, ์ด ์ž‘์—…์„ ์ธ๋ฑ์Šค๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

8.2 ์ธ๋ฑ์Šค

# ์ธ๋ฑ์Šค ๊ตฌ์กฐ

์ธ๋ฑ์Šค๋Š” key-value ๊ตฌ์กฐ๋กœ ๋ณดํ†ต key ์—๋Š” column ์˜ ๊ฐ’, value ์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

# ์ธ๋ฑ์Šค ํŠน์ง•

DBMS๋Š” ์ธ๋ฑ์Šค๋ฅผ column ์˜ ๊ฐ’์„ ์ด์šฉํ•ด ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ์ƒ ์ •๋ ฌ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ €์žฅํ•˜๋Š” ๊ณผ์ •์„ ๋Š๋ฆด ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ํ•ญ์ƒ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋น ๋ฅธ ์†๋„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค,

 

์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์€ ํ…Œ์ด๋ธ”์—์„œ INSERT, UPDATE, DELETE ๋ฌธ์žฅ์˜ ์ฒ˜๋ฆฌ๋Š” ๋Š๋ ค์ง€์ง€๋งŒ, SELECT ๋Š” ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

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

 

์ฆ‰, ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ(์“ฐ๊ธฐ)์„ฑ๋Šฅ์„ ํฌ์ƒํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ฝ๊ธฐ ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ• ์ง€ ๋ง์ง€๋Š” ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ์†๋„๋ฅผ ์–ด๋””๊นŒ์ง€ ํฌ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ์ฝ๊ธฐ ์†๋„๋ฅผ ์–ผ๋งˆ๋‚˜ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์•„ ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

* SELECT ์˜ WHERE ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” column ์ด๋ผ๊ณ  ์ „๋ถ€ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์“ฐ๊ธฐ ์ž‘์—… ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

 

# ์ธ๋ฑ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ B-Tree ์™€ Hash

  • B-Tree ์ธ๋ฑ์Šค๋Š” column ์— ์ €์žฅ๋œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์„œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Hash ์ธ๋ฑ์Šค๋Š” column ์˜ ๊ฐ’์œผ๋กœ ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ํ•ด์‹œ๋งต์˜ ์กฐํšŒ๊ฐ€ O(1) ์ธ ๊ฒƒ์ฒ˜๋Ÿผ, Hash ์ธ๋ฑ์Šค์ผ ๊ฒฝ์šฐ ์กฐํšŒ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.
    • ํ•˜์ง€๋งŒ, column ์˜ ๊ฐ’์„ ๋ณ€ํ˜•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— column ์˜ ๊ฐ’์œผ๋กœ ๋ฒ”์œ„ ๊ฒ€์ƒ‰์„ ํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€๋งŒ์„ ๊ฒ€์ƒ‰ํ•  ๋•Œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ Hash์ธ๋ฑ์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌDB์ธ Redis ๋‚˜ ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ๋‚ด์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌDB์ธ h2 ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

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

8.3.1 B-Tree ๊ตฌ์กฐ

B-Tree ์˜ B๋Š” Binary(์ด์ง„) ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ Balanced ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์ตœ์ƒ์œ„์— ํ•˜๋‚˜์˜ ๋ฃจํŠธ(Root) ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ , ํŠธ๋ฆฌ๊ตฌ์กฐ์˜ ๊ฐ€์žฅ ํ•˜์œ„์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ฆฌํ”„(Leaf) ๋…ธ๋“œ๋ผ ํ•˜๊ณ , ํŠธ๋ฆฌ๊ตฌ์กฐ์—์„œ ๋ฃจํŠธ๋„ ๋ฆฌํ”„๋„ ์•„๋‹Œ ์ค‘๊ฐ„ ๋…ธ๋“œ๋ฅผ ๋ธŒ๋žœ์น˜(Branch) ๋…ธ๋“œ๋ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ธ๋ฑ์Šค(B-Tree)์˜ ๋ฆฌํ”„ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๊ฐ€๊ธฐ ์œ„ํ•œ ์ฃผ์†Ÿ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

* ์ธ๋ฑ์Šค ๋ฐ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋Š” ํŒŒ์ผ ํ˜•ํƒœ๋กœ SSD์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

์ธ๋ฑ์Šค์˜ ํ‚ค๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ์ง€๋งŒ, ์•„๋ž˜ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ ๋Œ€๋ถ€๋ถ„์˜ RDBMS์—์„œ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋Š” ์ •๋ ฌ๋ผ ์žˆ์ง€ ์•Š๊ณ  ๋ฌด์ž‘์œ„ ์ˆœ์„œ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฌด์ž‘์œ„ ์ˆœ์„œ๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— Random I/O ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์ด๋Ÿฌํ•œ RandomI/O ์ค„์ด๊ธฐ ์œ„ํ•ด ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ์ธ๋ฑ์Šค๋กœ ์กฐํšŒ๋ฅผ ํ•˜์—ฌ ์ˆœ์ฐจ I/O ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค์˜ B-Tree ๊ตฌ์กฐ

 

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

๊ทธ๋ฆฌ๊ณ , ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ์ธ๋ฑ์Šค๋กœ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ๋•Œ, ์•„๋ž˜ ๊ทธ๋ฆผ์˜ ๋…ธ๋ž€์ƒ‰ ์„ ์„ ๋”ฐ๋ผ B-Tree ๋ฅผ 2๋ฒˆ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์ปจ๋”๋ฆฌ B-Tree ์ธ๋ฑ์Šค์˜ key ๋Š” column ์˜ ์‹ค์ œ ๊ฐ’, value ์— PK๊ฐ’์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด MySQL 8.0 ๊ณผ ๋‹ค๋ฅธ RDBMS ์™€ ๋‹ค๋ฅธ ํŠน์ง•๋“ค ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

MySQL InnoDB์—”์ง„์˜ ์ธ๋ฑ์Šค ํƒ์ƒ‰ ๊ตฌ์กฐ

 

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

์ธ๋ฑ์Šค๋Š” ์“ฐ๊ธฐ ์ž‘์—…์˜ ์„ฑ๋Šฅ์„ ํฌ๊ธฐํ•˜๊ณ  ์ฝ๊ธฐ ์ž‘์—…์˜ ์„ฑ๋Šฅ์„ ์–ป๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ƒ๊ธฐํ•˜๋ฉฐ ์ธ๋ฑ์Šค์˜ ํ‚ค๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

# ์ถ”๊ฐ€

๋ ˆ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค B-Tree ์— ๋…ธ๋“œ(์ธ๋ฑ์Šค)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

1. ์ด ๋…ธ๋“œ๋ฅผ B-Tree ์–ด๋””์— ์ €์žฅํ• ์ง€ ํƒ์ƒ‰

2. ์ ์ ˆํ•œ ์œ„์น˜๋ฅผ ์ฐพ์•„์„œ ๋ฆฌํ”„๋…ธ๋“œ์— ์ €์žฅํ•  ๋•Œ, ๋ฆฌํ”„๋…ธ๋“œ๊ฐ€ ๊ฝ‰์ฐจ ์žˆ๋‹ค๋ฉด ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ž‘์—…์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๊ณผ์ •์ด ์žˆ๊ธฐ์— B-Tree ์ธ๋ฑ์Šค์˜ ์ถ”๊ฐ€๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.

๋‹ค๋งŒ, InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„(MySQL 8.0 ์˜ ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„)์€ ์ด ์ž‘์—…์„ ์ง€์—ฐ์‹œ์ผœ ๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, PK ๋‚˜ ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ์ค‘๋ณต ์ฒดํฌ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฆ‰์‹œ B-Tree ์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

Memory ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„, MyISAM ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ด๋ธ”์—์„œ๋Š” ์ฆ‰์‹œ B-Tree ์ธ๋ฑ์Šค์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

 

# ์‚ญ์ œ

์ธ๋ฑ์Šค ํ‚ค ์‚ญ์ œ๋Š” ๋‹จ์ˆœํžˆ ํ•ด๋‹น ํ‚ค๋ฅผ ์ฐพ์•„์„œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

 

# ๋ณ€๊ฒฝ

๋‹ค๋งŒ, ํ‚ค ๋ณ€๊ฒฝ์€ ๋‹จ์ˆœํžˆ ๊ฐ’์„ ๋ฎ์–ด์”Œ์šฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋จผ์ € ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„์„œ ์‚ญ์ œํ•œ ํ›„, ๋‹ค์‹œ ์ƒˆ๋กœ์šด ํ‚ค ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋Š” ์“ฐ๊ธฐ ์ž‘์—…์˜ ์„ฑ๋Šฅ์„ ํฌ๊ธฐํ•˜๊ณ , ์ •๋ ฌ๋œ ์ƒํƒœ์˜ ์ธ๋ฑ์Šค๋กœ ์กฐํšŒ ์„ฑ๋Šฅ์„ ๋†’์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

# ๊ฒ€์ƒ‰

  • ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒ€์ƒ‰์€ SELECT ๊ตฌ๋ฌธ๋ฟ ์•„๋‹ˆ๋ผ UPDATE ์™€ DELETE ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ๋„ ์‚ฌ์šฉ
    • ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฌธ์—๋„ WHERE ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค
  • ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” column ์˜ ํ‚ค ๊ฐ’์˜ ๋’ท๋ถ€๋ถ„๋งŒ ๊ฒ€์ƒ‰ํ•˜๋Š” ์šฉ๋„๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ex) SQL์ฟผ๋ฆฌ์—์„œ WHERE ์ ˆ์— 'Like %ํŠน๋ณ„์‹œ' ๊ฐ™์ด ์™€์ผ๋“œ ์นด๋“œ ์‚ฌ์šฉ
  • column ์˜ ๊ฐ’์„ ๋ณ€ํ˜•ํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
    • B-Tree ์ธ๋ฑ์Šค๋Š” ์‹ค์ œ column ์˜ ๊ฐ’์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ
  • InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ž ๊ทผํ›„ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ธ‰๋‹ˆ๋‹ค.
    • ๊ทธ๋ž˜์„œ, UPDATE ๋‚˜ DELETE ๋ฌธ์žฅ์ด ์‹คํ–‰๋  ๋•Œ ํ…Œ์ด๋ธ”์— ์ ์ ˆํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฉด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŽ์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ธ‰๋‹ˆ๋‹ค.

 

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

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

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์˜ ํŽ˜์ด์ง€ ํฌ๊ธฐ์˜ ๊ธฐ๋ณธ๊ฐ’์€ 16KB ์ž…๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๋„ ์ €์žฅ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค์˜ ํ‚ค ๊ฐ’์ด ๋Š˜์–ด๋‚œ๋‹ค๋ฉด ์ž์—ฐ์Šค๋ ˆ ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€(16KB)์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค ๊ฐœ์ˆ˜๊ฐ€ ์ ์–ด์ง€๋ฉฐ ์ด๋Š” ๋””์Šคํฌ I/O ํšŸ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‹ˆ, ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค column ์˜ ํƒ€์ž…์„ varchar ๋‚˜ blob ๊ฐ™์€ ๊ฑธ ํ•˜์ง€ ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

# ์„ ํƒ๋„(๊ธฐ์ˆ˜์„ฑ)

์ธ๋ฑ์Šค์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ํ‚ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ํ‚ค์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ์ธ๋ฑ์Šค ๊ฒ€์ƒ‰ ๋Œ€์ƒ์ด ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋งŒํผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

 

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

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

๊ทธ๋ž˜์„œ, ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ฝ์–ด์•ผ ํ•  ๋ ˆ์ฝ”๋“œ์˜ ๊ฑด์ˆ˜(์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์˜ˆ์ƒํ•œ ๊ฑด์ˆ˜)๊ฐ€ ์ „์ฒด ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ์˜ 20~25%๋ฅผ ๋„˜์–ด์„œ๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋”๋ผ๋„ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ , ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ์ง์ ‘ ์ฝ์–ด์„œ ํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ๋งŒ ๊ฐ€๋ ค๋‚ด๋Š” ํ•„ํ„ฐ๋ง ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

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

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

๊ฒ€์ƒ‰ํ•ด์•ผ ํ•  ์ธ๋ฑ์Šค์˜ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹

์‹œ์ž‘ํ•ด์•ผ ํ•  ๋ฆฌํ”„ ๋…ธ๋“œ ์œ„์น˜๋ฅผ ์ฐพ์œผ๋ฉด ๊ทธ๋•Œ๋ถ€ํ„ฐ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๋ ˆ์ฝ”๋“œ๋งŒ ์ˆœ์„œ๋Œ€๋กœ ์ฝ๋Š”๋‹ค.

 

์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์€ ์ˆœ์ฐจI/O? ๋žœ๋คI/O?

  • ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค์— ๊ธฐ๋ฐ˜ํ•œ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์€ ์ˆœ์ฐจ I/O ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค
    • PK ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ •๋ ฌ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ ˆ์ธ์ง€ ์Šค์บ”์ด ์ˆœ์ฐจ I/O ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค์— ๊ธฐ๋ฐ˜ํ•œ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์€ ๋žœ๋ค I/O ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
    • ์„ธ์ปจ๋”๋ฆฌ ์ธ๋ฑ์Šค์˜ ๋ฆฌํ”„ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ์–ด๋„ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” PK ๊ธฐ๋ฐ˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ธ๋ฑ์Šค๋ฅผ ํ•œ ๋ฒˆ ๋” ํƒ์ƒ‰ํ•ด์•ผํ•˜๊ณ , ์ด๋Š” ๋ ˆ์ฝ”๋“œ์— ๋žœ๋ค ์ ‘๊ทผ์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

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

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

 

์ฟผ๋ฆฌ๊ฐ€ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์„ ๋•Œ, ์ฃผ๋กœ ์ด ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

* ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค : ์ฟผ๋ฆฌ๋กœ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ธ๋ฑ์Šค ํƒ์ƒ‰ ๋งŒ์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค

 

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

๋“ฌ์„ฑ๋“ฌ์„ฑํ•˜๊ฒŒ ์ธ๋ฑ์Šค๋ฅผ ์ฝ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ์ค‘๊ฐ„์— ํ•„์š”์น˜ ์•Š์€ ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์€ ๋ฌด์‹œํ•˜๊ณ  ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ GROUP BY ๋˜๋Š” ์ง‘ํ•ฉ ํ•จ์ˆ˜์˜ MAX(), MIN() ์— ๋Œ€ํ•ด ์ตœ์ ํ™” ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค.

 

ex) (dept_no, emp_no) ์กฐํ•ฉ์œผ๋กœ ์ธ๋ฑ์Šค ์ƒ์„ฑ ์‹œ, dept_no ์˜ d002 ์ปฌ๋Ÿผ๋“ค ์ค‘์—์„œ ์ฒซ ๋ฒˆ์งธ๋งŒ ์ฝ์œผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

SELECT dept_no, MIN(emp_no)
FROM dept_emp
WHERE dept_no BETWEEN 'd002' AND 'd004'
GROUP BY dept_no;

 

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

MySQL 8.0 ๋ถ€ํ„ฐ ๋„์ž…

๋‹ค์Œ 2๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ, (gender, birth_date) ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด๋„ ์ธ๋ฑ์Šค๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋‹ค.

  • ์กฐ๊ฑด 2๊ฐ€์ง€
    • WHERE ์กฐ๊ฑด ์ ˆ์— ์กฐ๊ฑด์ด ์—†๋Š” ์ธ๋ฑ์Šค์˜ ์„ ํ–‰ ์นผ๋Ÿผ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์–ด์•ผ ํ•œ๋‹ค.(์˜ˆ์‹œ์—์„œ gender ์˜ ๊ฐ’์€ Female ๊ณผ Male ๋‘˜ ์ค‘ 1๊ฐœ์ด๋‹ค)
    • ์ฟผ๋ฆฌ๊ฐ€ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
SELECT gender, birth_date 
FROM employees 
WHERE birth_date >= '1965-02-02';