์ ๋ฆฌ์ค - 4
by JiwonDev๋์คํฌ์ ๋ฐ์ดํฐ๋ ์์๋๋ก ์ ์ฅ๋์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ๊ธฐ ๋๋์ด ์ ์ฅ๋๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ๋ฐ์ดํฐ๋ฅผ ํ๋ํ๋ ์ ๋ถ ์กฐ๊ฑด์ ๊ฒ์ฌํด์ ๊ฐ์ ธ์ค๋ฉด ๊ฒ์ ์ฑ๋ฅ์ด ๋งค์ฐ ๊ตฌ๋ ค์ง๋๋ค.
๊ทธ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ์ ์์น ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด๋๊ณ ์ฌ์ฉํฉ๋๋ค. ๋ง์น ์ฑ ๋ค์ ์์ธ(index)์ฒ๋ผ์.
๊ทธ๋ผ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ indexingํ๋ฉด ์ฑ๋ฅ์ด ๋ฏธ์น๋ฏ์ด ์ข์์ง๋ค๊ณ ์๊ฐํ ์๋ ์์ต๋๋ค.
๊ณผ์ฐ ๊ทธ๋ด๊น์? ์๋ฅผ ๋ค์ด๋ด ์๋ค. 600์ฅ ์ง๋ฆฌ ์ฑ ์ธ๋ฐ ์ธ๋ฑ์ค๊ฐ 300์ฅ ์ ๋ ๋๊ณ ๋ชจ๋ ๋จ์ด์ ์์น๊ฐ ์ ํ์๋ค๊ณ ์๊ฐํด๋ณด์ธ์. ์์ธ์ ํด๋์ ์๋ฏธ๊ฐ ์ ํ ์์ด์ง๋๋ค. ์์ฃผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ฑ์ฑ ํด์ผํฉ๋๋ค.
* ์ฐธ๊ณ ๋ก ์ธ๋ฑ์ค๋ ๊ฒฐ๊ตญ ๋์คํฌ์ ์ ์ฅ๋ฉ๋๋ค. DBMS์ ๊ฐ์ฅ ์ค์ํ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์, ์ธ๋ฑ์ค๋ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ ํ ์ด๋ธ ์ค์บ์ ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ์น์ง ์๊ณ ํด๋น ํ ์ด๋ธ์ ๋์คํฌ ํ์ด์ง ๋จ์๋ก ์ ๋ถ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํ ์ธ๋ฑ์ค ์ค์บ์ ํ์ฌ ๊ฐ์ง๊ณ ์๋ ์ธ๋ฑ์ค๋ฅผ ์ ๋ถ ์กฐํํด์ ์ฐพ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ธ๋ฑ์ค์ ๋ง์ง๋ง ๋ ธ๋ (๋ฆฌํ ๋ ธ๋)๋ ๋์คํฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๊ฐ๋ฅดํค๊ณ ์์ต๋๋ค.
# ์ธ๋ฑ์ค์ ํธ๋ ์ด๋ ์คํ
์ธ๋ฑ์ค๋ ์กฐํ ์ฑ๋ฅ์ ํฌ๊ฒ ์ฌ๋ ค์ค๋๋ค. ํ์ง๋ง ์ฝ์ , ์์ , ์ญ์ ์ฑ๋ฅ์ ๋จ์ด์ง๊ฒ ๋ฉ๋๋ค. ๊ทธ ์ด์ ๋ ๋ ์ฝ๋๋ฅผ ์์ ํ ๋ ๋ง๋ค '์ธ๋ฑ์ค'๋ ํจ๊ป ๋๊ธฐํ ํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ DB์์ ์ธ๋ฑ์ค๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๋๊ฑด, ๋ณดํต Insert, delete, update๋ณด๋ค ์กฐํ Select๊ฐ ์๋์ ์ผ๋ก ๋ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
# InnoDB์ ์ธ๋ฑ์ค ๊ตฌ์กฐ
InnoDB๋ B-Tree๋ฅผ ๋ฒ ์ด์ค๋ก ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
๋ค๋ง InnoDB๋ ๋ฐ์ดํฐ ํ์ผ์ ์ ์ฅํ ๋, ํ๋ผ์ด๋จธ๋ฆฌ ํค๋ฅผ ์ธ๋ฑ์ค๋ก ์ ๋ ฌํ์ฌ ๊ด๋ฆฌํฉ๋๋ค.
์ฆ PK ์์ฒด๊ฐ ์ฃผ์ ์ญํ ์ ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ Range Scan์ด ๋งค์ฐ ๋น ๋ฆ ๋๋ค.
MySQL์์๋ PK์ Secondary Key Index (PK๋ฅผ ์ ์ธํ ํค)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
# B-Tree ๊ธฐ๋ฐ ์ธ๋ฑ์ค ์ฌ์ฉ์ ์ํฅ์ ๋ฏธ์น๋ ์์
- ์ธ๋ฑ์ค ํค ๊ฐ์ ํฌ๊ธฐ (InnoDB ๊ธฐ๋ณธ๊ฐ 16KB)
์ ์ฒด์ ์ธ ์ธ๋ฑ์ค์ ํฌ๊ธฐ๊ฐ ๋์ด๋ฉ๋๋ค. ๋ง์ฝ ๋๋ฌด ์ปค์ ํ ํ์ด์ง์ ๋ด์ ์ ์๋ค๋ฉด, 2๋ฒ ์ฝ์ด์์ผ ํฉ๋๋ค. - B-Tree์ ๊น์ด
์ฐพ๋ ๋จ๊ณ๊ฐ ๋ง์์ ธ์ ์ค๋ฒํค๋๊ฐ ์ฆ๊ฐํฉ๋๋ค.
๊ธธ์ด๋ฅผ ์ง์ ์ ์ผ๋ก ์กฐ์ ํ ์๋ ์์ต๋๋ค. ๋ ์ฝ๋๊ฐ ๋์ฉ๋์ด๋ผ ๊น์ด๊ฐ ๋์ด๋๋ค๋ฉด ์ธ๋ฑ์ค์ ํค ๊ฐ ํฌ๊ธฐ๋ฅผ ์ค์ฌ์ ๊น์ด๋ฅผ ์ต๋ํ ์๊ฒ ๋ง๋ค์ด์ผ ํฉ๋๋ค. - Selectivity(์ ํ๋)
์ธ๋ฑ์ค๋ก ์ ํ ํค๊ฐ์ด ์ผ๋ง๋ ๊ณจ๊ณ ๋ฃจ ํผ์ ธ์๋๊ฐ (๊ณ ์ ํ๊ฐ)์ ๋ํ ์ฒ๋์ ๋๋ค.
Hash Function์ฒ๋ผ ๊ณจ๊ณ ๋ฃจ ํผ์ ธ์์ด์ผ ์ธ๋ชจ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ง ์์ ์ฑ๋ฅ์ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. - ์ฝ์ด์ผ ํ๋ ๋ ์ฝ๋ ์
ํธ๋ฆฌ์ ๊น์ด๋ ๊ฐ์ ๋ด์ฉ์ด ์๋๊ฐ ์ถ์ง๋ง, ์ด๋ '๊ผญ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋๊ฐ?'์ ๋ํ ์ฒ๋์ ๋๋ค.
B-Tree ํน์ฑ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฌด์กฐ๊ฑด 1๋ฒ ์ด์์ ์ฝ๊ธฐ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.
ํ ์ด๋ธ ๋ ์ฝ๋์๊ฐ 100๋ง๊ฐ์ธ๋ฐ, 60๋ง๊ฐ๋ฅผ ์ฝ๋ ์์ ์ด๋ผ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์ง ์๋๊ฒ ๋ ๋น ๋ฆ ๋๋ค.
ํต๊ณ์ ์ธ ์์น๋ก 20% ๋ฏธ๋ง์ผ ๋์๋ ๊ทธ๋ฅ ์ฝ๋๊ฒ ๋ ๋น ๋ฆ ๋๋ค. ์ค์ ๋ก ์ตํฐ๋ง์ด์ ๊ฐ ๊ทธ๋ ๊ฒ ์ต์ ํ ํด์ค๋๋ค. - ์ ๋ํฌ ์์ฑ
์ฐพ๋ ์์ฑ๊ฐ์ด ๊ณ ์ ํ๊ฐ๋ ๋งค์ฐ ์ค์ํ ๋ฌธ์ ์ ๋๋ค.
๋ฑ 1๊ฐ๋ง ์กด์ฌํ๋ค๋ ๋ณด์ฅ์ด ์๋ค๋ฉด, ํ๋๋ฅผ ์ฐพ์ผ๋ฉด ๋ฐ๋ก ๋์์ ๋ฉ์ถ๋ฉด ๋ฉ๋๋ค.
ํ์ง๋ง ๊ทธ๋ฐ ๋ณด์ฅ์ด ์๋ค๋ฉด ์ต์ ํํ ์ ์๊ณ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๋ค ๋ค์ ธ์ผ๊ฒ ์ฃ .
# ์ธ๋ฑ์ค ์ฌ์ฉ์ ๋ํ ๋ถ๋ฅ
- ์ธ๋ฑ์ค Range Scan
์ ์ฒด๋ฅผ ์ฝ์ง ์๊ณ ์ธ๋ฑ์ค์์ ํด๋น ๋ฒ์์ ํด๋นํ๋ ์ผ๋ถ๋ง ์ฝ์ด์ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
ํํ ์ธ๋ฑ์ค๋ฅผ ํ์ ์ฑ๋ฅ์ด ํฅ์๋์๋ค๋๊ฑด ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ ์๋ฏธํฉ๋๋ค.
SELECT * FROM employees WHERE first_name BETWEEN 'A' AND 'C'; - ์ธ๋ฑ์ค Full Scan
์ธ๋ฑ์ค๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ๋ค ์ฝ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํจ์จ์ ์ด์ง ์์ ๊ฒฝ์ฐ์ ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, Index Full Scan์ด๋ผ๊ณ ํํํฉ๋๋ค.
- Loose Index Scan
๋ ์ธ์ง ์ค์บ์ฒ๋ผ ์ผ๋ถ๋ง ์ฝ๋๋ฐ, ํ๋ฒ์ ์ญ ์ฝ๋๊ฒ ์๋๋ผ ์ค๊ฐ ๊ฐ์ ๋ฐ์ด๋๊ณ ๋ฌ์ฑ ๋ฌ์ฑ ์ฝ๋ ๋ฐฉ๋ฒ์ ๋๋ค. - Index Skip Scan
ํน์ ์กฐ๊ฑด์์ ๋์ํ๋ ์ค์บ ๋ฐฉ์์ ๋๋ค. ์๋ฅผ ๋ค์ด ์๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํด๋ด ์๋ค.
SELECT gender, birth_date FROM employees WHERE birth_date >= '1996-01-01';
์ฑ๋ณ์ [๋จ, ์ฌ] 2๊ฐ์ง ๊ฐ ๋ฐ์ ์์ต๋๋ค. ๊ทธ๋์ (gender, birth_date)๋ก ์ธ๋ฑ์ค๊ฐ ์กํ์๋ค๋ฉด ์ธ๋ฑ์ค์ ์ด์ ์ ์ด์ฉํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์์์ ์ฑ๋ณ์ด ์์ ์๊ธฐ ๋๋ฌธ์ด์ฃ .
์ด ๋ Index Skip Scan์ ํ์ฑํ ๋์ด์๋ค๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ต์ ํ ํด์ค๋๋ค.
์์ ๊ฐ(gender)์ ๋ฒ์๊ฐ ์๋ค๋ ๊ฒ์ ์ ์ ์์ ๋ MySQL์ ๋ค์๊ณผ ๊ฐ์ด ๋ ์ฟผ๋ฆฌ๋ก ๋ง๋ค์ด์ ์ต์ ํํฉ๋๋ค.
... WHERE gender='๋จ' and birth_date >= '1996-01-01'
... WHERE gender='์ฌ' and birth_date >= '1996-01-01'
์ด๋ ๊ฒ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ์ฟผ๋ฆฌ๋ฅผ ์ชผ๊ฐ๊ณ , ์ด๋ฅผ ํฉ์ณ์ ๋ ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค๋๋ก ์ต์ ํ ํด์ค๋๋ค.
* ๋๋ ์ฟผ๋ฆฌ์์ ํ์ํ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ธ๋ฑ์ค์ ํ์๋์ด ์์ด ๊ตณ์ด ๋์คํฌ์์ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ฌ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ(์ปค๋ฒ๋ง ์ธ๋ฑ์ค) Index Skip Scan ์ต์ ํ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
* ๋ค๋ง ์ด ๊ฒฝ์ฐ๋ ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๋๊ฒ ๋ ๋ซ์ต๋๋ค. ํค ๊ฐ์ ๋ฒ์ (์ ํ๋)๊ฐ ๋์ง ์๋ค๋ ๊ฑธ ์๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์. gender๊ฐ 2๊ฐ๋ผ๊ณ ํด์ ๋ฐ๋์ Skip Scan์ด ๋์ํ ๊ฑฐ๋ผ๊ณ ๋ณด์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
# Multi Column Index (๋๋ ๋ค์ค ๋ณตํฉ ์ธ๋ฑ์ค)
์์ Index Skip Scan์ ์์ ์์๋ ๋ณด์์ง๋ง, ์ธ๋ฑ์ค ์ปฌ๋ผ์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ ์์ ์ปฌ๋ผ์ ์์กดํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ์ค์ ์๋น์ค๋ฅผ ๊ตฌ์ถํ ๋ ์ธ๋ฑ์ค ์ค๊ณ์ ์ธ๋ฑ์ค ์์๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.
@ ์ ๋ ฌ ๋ฐฉํฅ
์ธ๋ฑ์ค๋ฅผ ์์ฑํ ๋ ๊ธฐ์กด์๋ ์ ๋ ฌ๋ฐฉํฅ ์ง์ ์ด ๋ถ๊ฐ๋ฅํ์ง๋ง, MySQL8.0 ๋ถํฐ๋ ๊ฐ๋ฅํฉ๋๋ค.
์ง์ ์ด ๋ถ๊ฐ๋ฅํ 5.X ๋ ๋ฒ์ ์ด๋ผ๋ฉด, ์ฟผ๋ฆฌ์ ์ ๋ ฌ ๋ฐฉํฅ์ ์์ด์ ์ฐ๋ฉด ์ธ๋ฑ์ค๋ฅผ ํ์ง ์๋๋ค๋ ๊ฒ๋ง ๊ธฐ์ตํด์ฃผ์ธ์.
SELECT * FROM dept_emp WHERE dept_no='d001' AND emp_no >= 1000; -- ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ
1. (dept_no, emp_no) -- ์ธ๋ฑ์ค 1
2. (emp_no, dept_no) -- ์ธ๋ฑ์ค 2
๋จ์ํ Select ๋ฌธ์ ์์ 2๊ฐ์ง ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ๋ณด์๋ค์ถ์ด ๊ทธ๋ฅ ์์๋ง ๋ค๋ฆ ๋๋ค.
1๋ฒ์ ๊ฒฝ์ฐ dept_no ์์๋ก ์ธ๋ฑ์ค๊ฐ ์ ๋ ฌ๋์ด์์ด์ d001์ ์ฐพ๊ณ ๊ทธ๋ฅ ์ญ ์ฝ์ด๋ฒ๋ฆฌ๋ฉด ๋๋ฉ๋๋ค.
2๋ฒ์ ๊ฒฝ์ฐ emp_no ์์๋ก ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋จผ์ emp_no>=1000 ์กฐ๊ฑด์ ์ฐพ๊ณ , dept_no๊ฐ d001์ด ๋ง๋์ง ์ผ์ผ์ด ๋น๊ตํด์ผ ํฉ๋๋ค.
# ์ธ๋ฑ์ค๋ฅผ ํ์ง ๋ชปํ๋ ์กฐ๊ฑด
- NOT-EQUAL์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ( NOT IN, NOT BETWEEN, IS NOT NULL )
์ธ๋ฑ์ค ๊ตฌ์กฐ์ ํน์ฑ์, ๋ถ์ ํ์ ์ด์ฉ ์ ์์ด ๋ฒ์๋ฅผ ์ขํ๋ ์์ผ๋ก ์ผ์ผ์ด ๋น๊ตํด์ผ ํฉ๋๋ค. ์ธ๋ฑ์ค ๋ถ๊ฐ๋ฅ. - LIKE ๋ท๋ถ๋ถ ์ผ์น
B-TREE ์ธ๋ฑ์ค๋ ์์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋์ด ์๊ธฐ ๋๋ฌธ์, ๋ท๋ถ๋ถ ์ผ์น๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค. ํ์ค์บใฑ - ์คํ ์ด๋ ํจ์๋ ์ฐ์ฐ์๋ก ์นผ๋ผ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ
์นผ๋ผ์ด ๋ณํ๋๋ฉด ์ธ๋ฑ์ค์ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์นผ๋ผ ๋น๊ต์กฐ๊ฑด์ Not-Deterministic ์คํ ์ด๋ ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋งค๋ฒ ํธ์ถํด์ผํด์ ์ธ๋ฑ์ค ๋ถ๊ฐ. - ๋ฐ์ดํฐ ํ์
์ด ๋ค๋ฅธ ๊ฒฝ์ฐ (์ธ๋ฑ์ค ์นผ๋ผ ํ์
์ ๋ณํํด์ผ ๋น๊ต๊ฐ ๊ฐ๋ฅํ ๊ฒฝ์ฐ)
์ด ์ญ์๋ ๋งค๋ฒ ๋ณํ์ ํด์ผํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค. - ๋ฌธ์์ด ๋ฐ์ดํฐ ํ์
์ด ๋ค๋ฅธ ๊ฒฝ์ฐ
๋ฌธ์์ด์ด๋ผ๊ณ ๋ค ๋๊ฐ์ด ๋ ๊ฑฐ๊ฐ์ง๋ง, ์ด ์ญ์๋ ๋ฌธ์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ด ๊ฐ์์ง ํ์ธํด์ผํฉ๋๋ค.
๋น์ฐํ 'UTF8'๊ณผ 'euc-kr'์ ๋น๊ตํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ํ์ง ๋ชปํฉ๋๋ค. ๋ณํํด์ผํ๋๊น์.
'๐ฑBackend > DB(MySQL,PostgreSQL)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ฆฌ์ค-6 (0) | 2021.10.27 |
---|---|
์ ๋ฆฌ์ค-5 (0) | 2021.10.27 |
์ ๋ฆฌ์ค - 3 (0) | 2021.10.20 |
์ ๋ฆฌ์ค -2 (0) | 2021.10.20 |
์ ๋ฆฌ์ค #1 ์์ง ์ํคํ ์ฒ (0) | 2021.10.13 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev