๊ด€๋ฆฌ ๋ฉ”๋‰ด

โœ๐Ÿป๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ

B-Tree ๋ณธ๋ฌธ

DB/RDBMS

B-Tree

์ฉ์‹œํ‚ด 2023. 1. 29. 17:03
728x90

B-Tree(B(Balanced)-Tree)๋ž€?

Database์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

๊ตฌ์กฐ ๋ฐ ํŠน์„ฑ

RDBMS์—์„œ btree์˜ ๋ณ€ํ˜•์ธ B+Tree, B*-Tree ์œ ํ˜•๋„ ์‚ฌ์šฉ

์ธ๋ฑ์Šค๋Š” ํ…Œ์ด๋ธ”์˜ ํ‚ค ์นผ๋Ÿผ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ‚ค์นผ๋Ÿผ์„ ์ฝ์–ด ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ณณ์— ๊ฐ€์„œ ์กฐํšŒํ•ด์•ผ ํ•œ๋‹ค.

์ตœ์ƒ์œ„ Root Node
์ค‘๊ฐ„ Branch Node
ํ•˜๋‹จ(์‹ค์ œ ๋ฐ์ดํ„ฐ ์ปฌ๋Ÿผ์„ ์ฐพ์•„๊ฐ€๋Š” ์ฃผ์†Ÿ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ) Leaf Node

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

์ธ๋ฑ์Šค ํ‚ค ์ถ”๊ฐ€, ์‚ญ์ œ, ๋ณ€๊ฒฝ ๋“ฑ์€ MySQL v5.5 ์ดํ›„ (InnoDB์—”์ง„) ์ฒด์ธ์ง€ ๋ฒ„ํผ๋ฅผ ํ†ตํ•ด ์ง€์—ฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

  • ์ธ๋ฑ์Šค ํ‚ค ์ถ”๊ฐ€
    • ์ €์žฅ๋  ํ‚ค ๊ฐ’์„ ์ด์šฉํ•ด B-Tree๋‚ด๋ถ€์˜ ์ ์ ˆํ•œ ์œ„์น˜ ๊ฒ€์ƒ‰
    • ์ €์žฅ๋  ์œ„์น˜๊ฐ€ ์ •ํ•ด์ง€๋ฉด ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋‹ด๋Š” leaf Node์— ์ €์žฅ
  • ์ธ๋ฑ์Šค ํ‚ค ์‚ญ์ œ
    • ์‚ญ์ œํ•  ํ‚ค๊ฐ’์ด ์ €์žฅ๋œ b-tree๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ๋งˆํ‚น
  • ์ธ๋ฑ์Šค ํ‚ค ๋ณ€๊ฒฝ
    • ์ธ๋ฑ์Šค์˜ ํ‚ค ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋จผ์ € ์‚ญ์ œ ํ›„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ
  • ์ธ๋ฑ์Šค ํ‚ค ๊ฒ€์ƒ‰(ํŠธ๋ฆฌํƒ์ƒ‰)
    • Root Node → Branch Node → Leaf Node์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰

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

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

  • ์ธ๋ฑ์Šค์˜ ํŽ˜์ด์ง€ ํฌ๊ธฐ์™€ ํ‚ค๊ฐ’์— ๋”ฐ๋ผ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ ๊ฐœ์ˆ˜ ๊ฒฐ์ • ๋จ
  • innodb_page_size ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ ์„ค์ • ๊ฐ€๋Šฅ
  • ๊ธฐ๋ณธ : 16KB, 4~64KB๊นŒ์ง€ ์„ค์ • ๊ฐ€๋Šฅ

2. B-Tree ๊นŠ์ด

  • B-Tree ๊นŠ์ด๋Š” MySQL์—์„œ ๊ฐ’์„ ๊ฒ€์ƒ‰ ์‹œ ๋””์Šคํฌ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋Š” ํšŸ์ˆ˜์™€ ์ง๊ฒฐ๋จ
  • ์ธ๋ฑ์Šค ํ‚ค๊ฐ’์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ์ˆ˜๋ก ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€๊ฐ€ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์˜ ๊ฐœ์ˆ˜ ๊ฐ์†Œ ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ™์€ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋ผ๋„ B-Tree๊นŠ์ด๊ฐ€ ๊นŠ์–ด์ ธ์„œ ๋””์Šคํฌ ์ฝ๊ธฐ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€

3. ์„ ํƒ๋„(๊ธฐ์ˆ˜์„ฑ Cardinality)

  • ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’ ๊ฐ€์šด๋ฐ ์œ ๋‹ˆํฌ ํ•œ ๊ฐ’์˜ ์ˆ˜
  • ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‚ฎ์„ ์ˆ˜๋ก ๊ฒ€์ƒ‰ ๋Œ€์ƒ์ด ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์š”์†Œ๊ฐ€ ๋จ

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

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

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

MySQL์ด ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ• ์†Œ๊ฐœ

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

์ธ๋ฑ์Šค ์ ‘๊ทผ ๋ฐฉ๋ฒ• ์ค‘ ๋Œ€ํ‘œ์ ์ด๋ฉฐ ๋น ๋ฅธ ๋ฐฉ๋ฒ•

Btree์˜ ํ•„์š”ํ•œ ์˜์—ญ์„ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ๋ฒ•

Root → Branch → Leaf Node๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์Šค์บ”ํ•˜์—ฌ ํ•„์š”ํ•œ Leaf Node๋งŒ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ์‹

Leaf Node์—์„œ ์ €์žฅ๋œ ๋ ˆ์ฝ”๋“œ ์ฃผ์†Œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ ๋ ˆ์ฝ”๋“œ๋งˆ๋‹ค random I/O๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ธ๋ฑ์Šค๋กœ ์ฝ์–ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์ฒด์˜ 20 ~ 25%๊ฐ€ ๋„˜๋Š”๋‹ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ๋ณด๋‹ค๋Š” ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์ง์ ‘ ์ฝ๋Š” ๊ฒƒ์ด ํšจ์œจ์ 

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

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

3. ๋ฃจ์Šค(Loose) ์ธ๋ฑ์Šค ์Šค์บ”

  • Loose์˜ ๋ง๋œป์ฒ˜๋Ÿผ ๋“ฌ์„ฑ๋“ฌ์„ฑ ์ธ๋ฑ์Šค๋ฅผ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ์‹
  • MySQL 8.0๋ถ€ํ„ฐ ์ง€์›๋˜๋ฉฐ ๋‹ค๋ฅธ ์ƒ์šฉ RDBMS์˜ ์ธ๋ฑ์Šค ์Šคํ‚ต ์Šค์บ”๊ณผ ์œ ์‚ฌ
  • ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”๊ณผ ์œ ์‚ฌ ํ•˜์ง€๋งŒ ์ค‘๊ฐ„์ค‘๊ฐ„ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ธ๋ฑ์Šค ํ‚ค๊ฐ’์€ ๋ฌด์‹œํ•˜๊ณ  ๋‹ค์Œ ํ•„์š”ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ฝ์Œ

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

ALTER TABLE employees ADD INDEX ix_gender_birth(gender, birth_date);

employeesํ…Œ์ด๋ธ”์˜ gender, birth๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฐํ•ฉ์นผ๋Ÿผ ์ธ๋ฑ์Šค ์ƒ์„ฑ

ํ•˜์ง€๋งŒ ์•„๋ž˜ ์ฟผ๋ฆฌ์—์„œ๋Š” ์œ„์—์„œ ์ƒ์„ฑํ•œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ธ๋ฑ์Šค์˜ ์ฒซ ๋ฒˆ์งธ ์นผ๋Ÿผ์ด where์ ˆ์— ๊ฒ€์ƒ‰์กฐ๊ฑด์œผ๋กœ ์™€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ธ๋ฑ์Šค ์Šคํ‚ต ์กฐ๊ฑด์„ ํ†ตํ•ด ์•„๋ž˜์˜ ์ฟผ๋ฆฌ์—์„œ๋„ ์ธ๋ฑ์Šค์— ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

-- ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๋ชปํ•จ
SELECT * FROM employees WHERE birth_date >= '1995-01-01';
-- ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ
SELECT * FROM employees WHERE gender = 'M' AND birth_date >= '1995-01-01';

MySQL 8.0๋ถ€ํ„ฐ ๋„์ž…๋œ ์ธ๋ฑ์Šค ์Šค์บ” ์„ค์ • ํ™œ์„ฑํ™”๋ฅผ ํ†ตํ•ด ์œ„์˜ ์ฟผ๋ฆฌ์—์„œ๋„ ์ธ๋ฑ์Šค์— ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

SET optimizer_swithch='skip_scan'=on';

gender์—์„œ ์œ ๋‹ˆํฌ ๊ฐ’์„ ๋ชจ๋‘ ์กฐํšŒํ•ด ์œ„์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ gender์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค.

์กฐ๊ฑด์ ˆ์— ๋น ์ง„ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์˜ distinct value ๊ฐœ์ˆ˜๊ฐ€ ์ ๊ณ  ํ›„ํ–‰ ์ปฌ๋Ÿผ์˜ distinct value ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ ์œ ๋ฆฌ

→ distinct value ๊ฐœ์ˆ˜๊ฐ€ ์ ๋‹ค

์˜ˆ) ์ปฌ๋Ÿผ gender : ‘M’, ‘W’์ฒ˜๋Ÿผ ์ค‘๋ณต ์—†์ด ๊ฐ’์ด ์ ์€ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.


[์ฐธ๊ณ ]

real MySQL 8.0

http://wiki.gurubee.net/pages/viewpage.action?pageId=4949506

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=weekamp&logNo=221600846268

728x90
๋ฐ˜์‘ํ˜•