Contents

B-Tree index

B-Tree Index

B-Tree ์ธ๋ฑ์Šค๋Š” ์ธ๋ฑ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ๊ฐ€์žฅ ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์—ฌ๊ธฐ์„œ B ๋Š” Balanced ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. (Binary ์•„๋‹˜) B-Tree index๋Š” ๊ตฌ์กฐ์ฒด ๋‚ด์—์„œ ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

๊ตฌ์กฐ ๋ฐ ํŠน์ง•

B-Tree ์ธ๋ฑ์Šค๋Š” Root / Branch / Leaf ์˜ 3๊ฐ€์ง€์˜ ๋…ธ๋“œ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ์—ฌ๊ธฐ์„œ Leaf ๋…ธ๋“œ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๋‹ค.

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

๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€,๋ณ€๊ฒฝ,์‚ญ์ œ ๋˜๋ฉด ์ธ๋ฑ์Šค๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€?

  • ์ถ”๊ฐ€

    • ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์˜ key๊ฐ’๊ณผ ์ฃผ์†Œ์ •๋ณด๋ฅผ leaf node์— ์ €์žฅํ•œ๋‹ค. ๋งŒ์•ฝ, leaf node๊ฐ€ ๊ฝ‰ ์ฐจ์„œ ์ €์žฅํ•  ์ˆ˜ ์—†์„ ๋•Œ๋Š”, ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ๋ถ„๋ฆฌ ์‹œ์ผœ์•ผ ํ•˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ์ƒ์œ„ branch node์˜ ์˜์—ญ๊นŒ์ง€ ํ™•์žฅ๋œ๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ, ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ write์˜ ์ž‘์—…์˜์—ญ์€ cost๊ฐ€ ๋งŽ์ด ๋“ค๊ฒŒ ๋œ๋‹ค.

    • ์ธ๋ฑ์Šค ์ถ”๊ฐ€๋กœ ์ธํ•ด write ์ž‘์—…์ด ์–ผ๋งŒํผ ์˜ํ–ฅ์„ ๋ฐ›์„์ง€๋ฅผ ์ƒ๊ฐํ•˜๋ ค๋ฉด, ํ…Œ์ด๋ธ”์˜ column ์ˆ˜, column์˜ ํฌ๊ธฐ, index column์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ๋Œ€๋žต์ ์œผ๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์˜ cost๋ฅผ 1์ด๋ผ ๊ฐ€์ •ํ•˜๋ฉด ์ธ๋ฑ์Šค์— ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” cost๋Š” 1.5๋กœ ์ƒ๊ฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ๋ฑ์Šค๊ฐ€ 3๊ฐœ๊ฐ€ ๋“ฑ๋ก๋œ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ cost๊ฐ€ ๋Œ€๋žต์ ์œผ๋กœ (1+1.5*3) = 5.5 ๊ฐ€ ๋œ๋‹ค.

    • mysql 8.0 ์ด์ƒ์ธ ๊ฒฝ์šฐ, InnoDB ์—”์ง„์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ•ด๋‹น ์—”์ง„์€ ์ธ๋ฑ์Šค๋ฅผ ์ฆ‰์‹œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ข€ ๋” ์ง€์—ฐ์‹œ์ผœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, PK๋‚˜ unique index์˜ ๊ฒฝ์šฐ ์ค‘๋ณต ์ฒดํฌ๋ฅผ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ฆ‰์‹œ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ์‚ญ์ œ

    • ์‚ญ์ œ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ์‚ญ์ œ๋งˆํ‚น์„ ํ•ด์ฃผ๊ณ , ํ•ด๋‹น ๊ณต๊ฐ„์€ ๋ฐฉ์น˜๋˜๊ฑฐ๋‚˜ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก InnoDB storage engine์ด ์•Œ์•„์„œ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.
  • ๋ณ€๊ฒฝ

    • ๋ณ€๊ฒฝ์˜ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ index์˜ key๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋Š”๊ฒŒ ์•„๋‹Œ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

Index์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ

  • Index column์˜ ํฌ๊ธฐ

    • ์œ„ ๊ทธ๋ฆผ์—์„œ ์ธ๋ฑ์Šค๋Š” ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. B-tree ์ธ๋ฑ์Šค์—์„œ ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ช‡ ๊ฐœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๊ฐ€ index์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ์ด๋‹ค. ํŽ˜์ด์ง€๋Š” innodb_page_size ๋ณ€์ˆ˜๋ฅผ ์กฐ์ •ํ•˜์—ฌ (4~64KB) ๊นŒ์ง€ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ๋ฑ์Šค key์˜ ํฌ๊ธฐ๊ฐ€ 16Byte ์ด๊ณ  ์ž์‹๋…ธ๋“œ์˜ ์ฃผ์†Œ๊ฐ€ 12byte๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€(16KB)์—๋Š” 16*1000 / (12+16) = 585๊ฐœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ, ์ธ๋ฑ์Šค key์˜ ํฌ๊ธฐ๊ฐ€ 32 byte๋กœ ๋Š˜์–ด๋‚  ๊ฒฝ์šฐ, ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€์—๋Š” 16 * 1000 / (12 + 32) = 372๊ฐœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
      ๋งŒ์•ฝ 500๊ฐœ์˜ record๋ฅผ ์ฝ๋Š” SELECT ์ฟผ๋ฆฌ๊ฐ€ ์กด์žฌํ•  ๋•Œ, ์ฒซ๋ฒˆ์งธ์˜ ๊ฒฝ์šฐ์—” ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‘๋ฒˆ์งธ์˜ ๊ฒฝ์šฐ์—” 2๊ฐœ์˜ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด์•ผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, column์˜ ํฌ๊ธฐ๊ฐ€ ์ธ๋ฑ์Šค ์ฒ˜๋ฆฌ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
  • record ๊ฐฏ์ˆ˜

    • ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์€ cost๊ฐ€ ๋“œ๋Š” ์ž‘์—…์ด๋‹ค. ๋Œ€๋žต ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ๋ณด๋‹ค 4~5๋ฐฐ ์ •๋„ cost๊ฐ€ ๋“œ๋Š” ์ž‘์—…์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ, ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ฝ์–ด์•ผํ•  ๋ ˆ์ฝ”๋“œ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์‹ค์ œ ๋ ˆ์ฝ”๋“œ์˜ 20~25%๋ฅผ ๋„˜์–ด์„œ๋ฉด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์€ Mysql optimizer๊ฐ€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • unique index์˜ ๊ฐฏ์ˆ˜ (=Cardinality, Selectivity)

    • ๋ชจ๋“  ์ธ๋ฑ์Šค์˜ key๊ฐ€ 100๊ฐœ์ด๊ณ , ๊ทธ ์ค‘ uniqueํ•œ key์˜ ๊ฐฏ์ˆ˜๋Š” 10์ด๋ผ ํ•  ๋•Œ, cardinality = 10 ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • cardinality๊ฐ€ ๋†’์„์ˆ˜๋ก ๊ฒ€์ƒ‰๋Œ€์ƒ์ด ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค. ์ฆ‰, ์ „์ฒด index key ๊ฐฏ์ˆ˜ ๋Œ€๋น„ unique key ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ์•„์•ผ ๊ฒ€์ƒ‰์†๋„๊ฐ€ ๋นจ๋ผ์ง„๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, 1๋งŒ๊ฑด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ณ , ์ฒซ๋ฒˆ์งธ ๊ฒฝ์šฐ์—”, unique column ๊ฐฏ์ˆ˜๊ฐ€ 10, ๋‘๋ฒˆ์งธ ๊ฒฝ์šฐ์—” unique column ๊ฐฏ์ˆ˜๊ฐ€ 1000์ด๋ผ ํ•˜์ž.
      ์ฒซ๋ฒˆ์งธ์˜ ๊ฒฝ์šฐ์—” carninality = 1000 ์ด๊ณ  1๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด 999๋ฒˆ์˜ ์กฐํšŒ๋ฅผ ํ•œ ๊ฒƒ์ด๋‹ค. ๋‘๋ฒˆ์งธ์˜ cardinality = 10์ด๊ณ , 1๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด 9๊ฑด์˜ ์กฐํšŒ๋ฅผ ๋” ํ•œ ๊ฒƒ์ด๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ด์šฉํ•˜๋Š”์ง€ ?

Index Range Scan

1
SELECT * FROM employees WHERE first_name between 'amy' and 'gary'

employee ํ…Œ์ด๋ธ”์— first_name ์ปฌ๋Ÿผ์— index๋ฅผ ์ ์šฉํ•˜๊ณ  ์œ„ ์ฟผ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒ€์ƒ‰ํ•  ๊ฒƒ์ด๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ์ฝ์„ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์„ index seek ์ด๋ผ ํ•˜๊ณ  ์ฐพ์€ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์ญ‰ ์ฝ๋Š” ๊ฒƒ์„ index scan ์ด๋ผ ํ•œ๋‹ค. ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ์ธ๋ฑ์Šค๋“ค์„ ์ฐพ๊ณ  ๋‚œ ํ›„์—” ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋กœ ๋ถ€ํ„ฐ random IO ๊ฐ€ ์ผ์–ด๋‚œ๋‹ค. random IO๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์†๋„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ, ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ์ž‘์—…์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์–ด๋–ค ๊ฒฝ์šฐ์—” ๋งˆ์ง€๋ง‰์— random IO๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค์ง€ ์•Š์•„๋„ ๋˜๋Š”๋ฐ ์ด๋ฅผ Covering Index๋ผ ํ•œ๋‹ค.

index seek, index scan ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค. SHOW STATUS LIKE '%Handler'

Covering Index
์ฟผ๋ฆฌ ์š”์ฒญ ์‹œ ์ธ๋ฑ์Šค๊ฐ€ ๊ฑธ๋ฆฐ ์ปฌ๋Ÿผ๋งŒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑธ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด (first_name, last_name) ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆด ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค. select first_name, last_name from table where first_name between 'amy' and 'gary' and last_name between 'alberts' and 'richard'

Index Full Scan

์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ธด ํ–ˆ์ง€๋งŒ, ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ชจ๋“  ์ธ๋ฑ์Šค๋ฅผ ์ฝ์„ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋Š” ๊ฑด ์ธ๋ฑ์Šค๋ฅผ ์ œ๋Œ€๋กœ ์ด์šฉํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฑธ ์˜๋ฏธํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.
(A,B,C) ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์ง€๋งŒ, ์ฟผ๋ฆฌ๋Š” B,C ์กฐ๊ฑด์„ ์ด์šฉํ•ด์„œ ์กฐํšŒํ•  ๊ฒฝ์šฐ์ด๋‹ค.
index range scan ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์ง€๋งŒ, ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์ปฌ๋Ÿผ๋งŒ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ table full scan ๋ณด๋‹ค๋Š” ์„ฑ๋Šฅ์ด ์ข‹๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์ธ๋ฑ์Šค์˜ ํฌ๊ธฐ๊ฐ€ ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ํฌ๊ธฐ๋ณด๋‹ค๋Š” ์ž‘๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Index Loose Scan

index skip scan ์€ index loose scan ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™์€ ํ•˜์ง€๋งŒ, ์ค‘๊ฐ„์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ’์€ Skip ํ•˜๊ณ  ๋„˜์–ด๊ฐ„๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ group by ๋‚˜ max, min ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ตœ์ ํ™”๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•œ๋‹ค. // todo : 10์žฅ ์‹คํ–‰๊ณ„ํš ์ฝ๊ณ  ์ถ”๊ฐ€

Index Skip Scan

์ธ๋ฑ์Šค์—์„œ ํ•ต์‹ฌ์€ ๊ฐ’์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค์˜ ์ˆœ์„œ๋„ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
employee ํ…Œ์ด๋ธ”์—” (gender, birth_date) ๋ผ๋Š” ์ˆœ์„œ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ๋‹ค์Œ ๋‘ ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์€ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

1
SELECT * FROM employees WHERE birth_date >= '1965-01-01'
1
SELECT * FROM employees WHERE gender = "M" and birth_date >= '1965-01-01'

์ฒซ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” Table Full Scan์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋‘๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” Index Range Scan์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ•  ๋•Œ ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ ์ปฌ๋Ÿผ๋งŒ์„ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋˜ ์ƒํ™ฉ์ด ๋‹ค๋ฅด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฒซ๋ฒˆ์งธ ์ฟผ๋ฆฌ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์ปฌ๋Ÿผ๋งŒ์„ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

1
SELECT gender, birth_date FROM employees WHERE  birth_date >= '1965-01-01'

ํ˜„์žฌ Mysql 8.0 ๋ถ€ํ„ฐ๋Š” optimizer๊ฐ€ birth_date ์ปฌ๋Ÿผ๋งŒ์œผ๋กœ index skip scan ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ตœ์ ํ™”๋ฅผ ํ•ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์ฟผ๋ฆฌ๋Š” Index Skip Scan์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

Index Skip Scan ์„ ์‚ฌ์šฉํ•  ๋• ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์˜์ ์ด ์„ ํ–‰๋œ๋‹ค.

  1. ์ฟผ๋ฆฌ๊ฐ€ ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ ์ปฌ๋Ÿผ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผํ•จ. (covering index)
  2. ์กฐ๊ฑด์ด ํฌํ•จ๋˜์ง€ ์•Š์€ ์„ ํ–‰ ์ปฌ๋Ÿผ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฒƒ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ ์–ด์•ผ ํ•จ.

2๋ฒˆ์˜ ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋ฅผ ๋“ค๋ฉด, (emp_no, dept_no) ๋กœ ์ด๋ฃจ์–ด์ง„ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, dept_no๋กœ๋งŒ ์กฐ๊ฑด์„ ๊ฑธ๊ณ  ์กฐํšŒ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ, emp_no์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— skip์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์กฐํšŒ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๋‹ค.