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์ ํฌ๊ธฐ๊ฐ ์ธ๋ฑ์ค ์ฒ๋ฆฌ์ ์ํฅ์ ์ค ์ ์๋ค๊ณ ๋งํ ์ ์๋ค.
- ์ ๊ทธ๋ฆผ์์ ์ธ๋ฑ์ค๋ ํ์ด์ง ๋จ์๋ก ๊ด๋ฆฌ๊ฐ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. B-tree ์ธ๋ฑ์ค์์ ๊ฐ ๋
ธ๋๊ฐ ์์ ๋
ธ๋๋ฅผ ๋ช ๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง๊ฐ index์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ์์์ด๋ค. ํ์ด์ง๋
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
|
|
employee ํ
์ด๋ธ์ first_name ์ปฌ๋ผ์ index๋ฅผ ์ ์ฉํ๊ณ ์ ์ฟผ๋ฆฌ๋ฅผ ํธ์ถํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฒ์ํ ๊ฒ์ด๋ค.
์ธ๋ฑ์ค๋ฅผ ์ฝ์ ์์น๋ฅผ ์ฐพ๋ ๊ฒ์ index seek
์ด๋ผ ํ๊ณ ์ฐพ์ ์๊ฐ๋ถํฐ ์ญ ์ฝ๋ ๊ฒ์ index scan
์ด๋ผ ํ๋ค.
์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ธ๋ฑ์ค๋ค์ ์ฐพ๊ณ ๋ ํ์ ๋ฐ์ดํฐ ํ์ผ๋ก ๋ถํฐ random IO ๊ฐ ์ผ์ด๋๋ค. random IO๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์๋์ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก, ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ์์
์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์
์ด๋ค.
์ฌ๊ธฐ์ ์ด๋ค ๊ฒฝ์ฐ์ ๋ง์ง๋ง์ random IO๋ฅผ ํตํด ๋ฐ์ดํฐ ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค์ง ์์๋ ๋๋๋ฐ ์ด๋ฅผ Covering Index
๋ผ ํ๋ค.
index seek, index scan ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ด๋ฉด ๋๋ค. SHOW STATUS LIKE '%Handler'
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) ๋ผ๋ ์์๋ก ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์๋ค๊ณ ๊ฐ์ ํ ๋ ๋ค์ ๋ ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค.
|
|
|
|
์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ๋ Table Full Scan
์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ๋๋ฒ์งธ ์ฟผ๋ฆฌ๋ Index Range Scan
์ผ๋ก ์ฒ๋ฆฌํ๋ค.
์ฟผ๋ฆฌ๋ฅผ ์์ฒญํ ๋ ์ธ๋ฑ์ค์ ํฌํจ๋ ์ปฌ๋ผ๋ง์ ์กฐํํ๋ ๊ฒฝ์ฐ๋ ๋ ์ํฉ์ด ๋ค๋ฅด๋ค. ์๋ฅผ ๋ค์ด ์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ์ ๋น์ทํ์ง๋ง ์ธ๋ฑ์ค๊ฐ ์์ฑ๋ ์ปฌ๋ผ๋ง์ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ์๋ค๊ณ ํด๋ณด์.
|
|
ํ์ฌ Mysql 8.0 ๋ถํฐ๋ optimizer๊ฐ birth_date ์ปฌ๋ผ๋ง์ผ๋ก index skip scan
์ ์ฌ์ฉํ๋๋ก ์ต์ ํ๋ฅผ ํด์ค๋ค.
๋ฐ๋ผ์ ์ ์ฟผ๋ฆฌ๋ Index Skip Scan
์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ค.
Index Skip Scan
์ ์ฌ์ฉํ ๋ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์์ ์ด ์ ํ๋๋ค.
- ์ฟผ๋ฆฌ๊ฐ ์ธ๋ฑ์ค์ ํฌํจ๋ ์ปฌ๋ผ๋ง์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ผํจ. (covering index)
- ์กฐ๊ฑด์ด ํฌํจ๋์ง ์์ ์ ํ ์ปฌ๋ผ์ ์ ๋ํฌํ ๊ฒ์ ๊ฐฏ์๊ฐ ์ ์ด์ผ ํจ.
2๋ฒ์ ๊ฒฝ์ฐ๋ฅผ ์๋ฅผ ๋ค๋ฉด, (emp_no, dept_no) ๋ก ์ด๋ฃจ์ด์ง ์ธ๋ฑ์ค๊ฐ ์๋ค๊ณ ํ ๋, dept_no๋ก๋ง ์กฐ๊ฑด์ ๊ฑธ๊ณ ์กฐํ๋ฅผ ํ๋ ๊ฒฝ์ฐ, emp_no์ ์ ๋ํฌํ ๊ฐฏ์๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ skip์ ์ฌ๋ฌ๋ฒ ํด์ผํ๋ฏ๋ก ์กฐํ ์ฑ๋ฅ์ด ์ข์ง ์๋ค.