0. ํ์ต ๋ชฉ์
- ์ธ๋ฑ์ค ๋จธ์ง๊ฐ ๋ฌด์์ธ์ง ์ดํดํ๋ค.
- ์ธ๋ฑ์ค ๋จธ์ง์ ์ข ๋ฅ์ธ ๊ต์งํฉ, ํฉ์งํฉ, ์ ๋ ฌ ํ ํฉ์งํฉ์ ์ดํดํ๋ค.
1. ์ธ๋ฑ์ค ๋จธ์ง๋?
Index Merge ๋ ํ๋์ ํ
์ด๋ธ์์ ๋ ๊ฐ ์ด์์ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ณํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณํฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ์ต์ ํ ์ ๋ต์ด๋ค.
๋ง์ฝ ํด๋น ์ต์ ์ ์ผ๋์ง ์์๋ค๋ฉด, ์ตํฐ๋ง์ด์ ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ๋, ํ๋์ ํ ์ด๋ธ์์๋ ์ค๋ก์ง ํ๋์ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ค.
2. ์ฌ์ฉ๋๋ ์กฐ๊ฑด
- ์ฟผ๋ฆฌ์ ์ฌ์ฉ๋ ๊ฐ๊ฐ์ ์กฐ๊ฑด์ด ํ๋์ ํ ์ด๋ธ ๋ด์ ์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์๋ค.
- ํ๋์ ์ธ๋ฑ์ค๋ก๋ง ์ฒ๋ฆฌํ์ ๊ฒฝ์ฐ ๋ฒ์ ํํฐ๋ง ํจ๊ณผ๊ฐ ๋ฏธ๋ฏธํ๋ค.
3. ์ข ๋ฅ
intersection
: ๊ฐ๊ธฐ ๋ค๋ฅธ ์ธ๋ฑ์ค๋ก ํํฐ๋งํ ๋ฐ์ดํฐ๋ค ์ฌ์ด์ ๊ต์งํฉ๋ง ๋ฐํunion
: ๊ฐ๊ธฐ ๋ค๋ฅธ ์ธ๋ฑ์ค๋ก ํํฐ๋งํ ๋ฐ์ดํฐ๋ค ์ฌ์ด์ ํฉ์งํฉ๋ง ๋ฐํ (์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํ ์ถ๊ฐ ์ ๋ ฌ ์์ ํ์ x)sort union
: 2๋ฒ๊ณผ ๊ฐ์ผ๋ ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํด ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ง ๋ชปํด์ ์ถ๊ฐ ์ ๋ ฌ ์์ ์ด ํ์ํจ.
(1) ๊ต์งํฉ (index_merge_intersection)
- ํ๋์ ํ ์ด๋ธ์์ 2๊ฐ ์ด์์ ์ธ๋ฑ์ค๋ก ๊ฐ๊ฐ ์ ํจํ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๋ค.
- ํํฐ๋งํ ๋ฐ์ดํฐ๋ค ์ค ๊ต์งํฉ๋ง ๋ณธ ํ ์ด๋ธ ์ฝ์ด์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ป๊ณ ์ฌ์ฉ์์๊ฒ ๋ฐํํ๋ค.
๋ง์ฝ ๋ค์๊ณผ ๊ฐ์ด ํ ์ด๋ธ์ด ์กด์ฌํ๋ค๊ณ ํ์.
CREATE TABLE emplyoees (
emp_no int (PRIMARY),
last_name VARCHAR(20),
first_name VARCHAR(20),
hire_date DATE
INDEX idx_first_name (first_name);
INDEX idx_hire_date (hire_date);
)engine='innodb'
์ดํ ๋ค์ ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๋ค.
explain
select * from employees
where first_name = 'Georgi'
and emp_no between 10000 and 20000;
ํ
์ด๋ธ์ ํ์ธํด๋ณด๋ฉด first_name์๊ฒ๋ ๋ณด์กฐ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ๊ณ , emp_no๋ PK๋ผ ํด๋ฌ์คํฐ๋ง ์ธ๋ฑ์ค๊ฐ ์๋ค.
๋ง์ฝ ์ตํฐ๋ง์ด์ ๊ฐ ๋ ์ค ํ๋๋ง ์จ๋ ์ฟผ๋ฆฌ๋ฌธ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค๋ฉด, ๊ทธ ๋ฐฉ๋ฒ์ ์ ํํ์ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ง์ฝ ์คํ ๊ณํ์ Using Intersect ๋ผ๊ณ ๋์จ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌ ๋ ๊ฒ์ด๋ค.
first_name = Georgi์กฐ๊ฑด์ idx_first_name์ผ๋ก ํํฐ๋งemp_no between 10000 and 20000์ ํด๋ฌ์คํฐ๋ง ์ธ๋ฑ์ค๋ก ํํฐ๋ง- ๋์ ๊ต์งํฉ๋ง ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ก ๋ฐํ
A. Index-merge-๊ต์งํฉ์ด ๋ ํจ์จ์ ์ธ ๊ฒฝ์ฐ๋ ์ธ์ ์ผ๊น?
์์ ์ฟผ๋ฆฌ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ์ํด ํ๋์ ์ธ๋ฑ์ค๋ง ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๊ฒฝ์ฐ 1. ๋ณด์กฐ ์ธ๋ฑ์ค๋ง ํ์ฉ
idx_first_name๋ณด์กฐ ์ธ๋ฑ์ค๋ก ์ด๋ฆ์ด Georgi์ธ ์ฌ๋์ range-scan ํ๋ 10๋ง ๋ช ์ค 253๋ช ์ด์๋ค.- ํด๋น 253๋ช ์ค ์ฌ๋ฒ์ด 10,000 ์์ 20,000์ธ ์ฌ๋์ ์ฐพ๊ธฐ ์ํด, ํ๋์ ๋ ์ฝ๋๋ง๋ค ๋ณธ ํ ์ด๋ธ๊ณผ ์ ๊ทผํ์ฌ ์ผ์ผํ ๋น๊ตํ๋ค. -> ๋ณธ ํ ์ด๋ธ ์ฝ๊ธฐ ์์ (253๋ฒ ํ์)
๊ฒฝ์ฐ 2. PK๋ง ํ์ฉ
- PK์ธ ์ฌ๋ฒ์ผ๋ก range-scan ํด๋ณด๋ ์ฌ๋ฒ์ด 10,000 - 20,000 ์ธ ์ฌ๋์ ๋ง ๋ช ์ด๋ค.
- ์ด ๋ง ๋ช ์ ๋ํด ๊ฐ๊ฐ ์ด๋ฆ์ด Geogi์ธ์ง ํ์ธํ๋ค. (๋ง ๋ฒ์ Where ์กฐ๊ฑด ๋น๊ต ์์ ํ์)
๊ฒฝ์ฐ 3. ์ธ๋ฑ์ค ๋จธ์ง ํ์ฉ
idx_first_name๊ณผPK๋ชจ๋ range-scan ํด์ ์ ํจํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.- ์์ชฝ ๋ชจ๋ PK๋ก ์ ๋ ฌ๋์ด ์๋ค. ๋ฐ๋ผ์ ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ถ๊ฐ ๋ฐ์ดํฐ ๋น๊ต ์์ ์์ด ๊ต์งํฉ์ ์ฐพ์ ๋ฐํํ๋ค.
๋ง์ฝ ์ต์ข ์ ์ผ๋ก ์ด๋ฆ์ด Georgi์ด๊ณ ์ฌ๋ฒ์ด ๋ง ๋ฒ๋์ธ ์ฌ๋์ด 14๋ช ์ด๋ฉด ๊ฒฝ์ฐ1์ 239๋ฒ์ ๋ฐ์ดํฐ ์ฝ๊ธฐ๊ฐ ๋ถํ์ํ ์์ ์ด๊ณ ๊ฒฝ์ฐ 2๋ 9,986 ๊ฑด์ด ๋ถํ์ํ ์์ ์ด์๋ค.
[!hint] ์คํ ๊ณํ ์ ํ์
Using intersect(์ฌ์ฉํ ๋ชจ๋ ์ธ๋ฑ์ค ์ด๋ฆ ๋์ด๋จ)
(2) ํฉ์งํฉ
ํด๋น ์ธ๋ฑ์ค ๋จธ์ง๋ OR ์ฐ์ฐ์ผ๋ก ํฉ์งํฉ์ ๊ตฌํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ๋ํ ์ต์ ํ ์ ๋ต์ด๋ค. ๋ค์๊ณผ ๊ฐ์ด ์๋ํ๋ค.
- ํ๋์ ํ ์ด๋ธ ๋ด์ ์ธ ์ ์๋ ์ธ๋ฑ์ค๋ฅผ ์ ๋ถ ํ์ฉํ์ฌ ์ ํจํ ๋ฐ์ดํฐ๋ง ๋จ๊ธฐ๊ธฐ
- ๋ฐ์ดํฐ ์งํฉ๋ค ์ฌ์ด์ ์ค๋ณต ์ ๊ฑฐ (Union ๋ณํฉ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉ)
- ์ค๋ณต ์ ๊ฑฐ๋ ๋ฐ์ดํฐ ๋ฐํ
2๋ฒ์ ๋ฐ์ดํฐ ์งํฉ ์ฌ์ด์ ์ค๋ณต ์ ๊ฑฐ์์ ๋ณํฉ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ฐ, ๋ณํฉ ์๊ณ ๋ฆฌ์ฆ ํน์ฑ ์, ๋ฐ์ดํฐ๋ค์ด ์ ๋ ฌ๋์ด ์๋ ์ํ๋ผ๋ ๊ฒ ์ ์ ๋์ด์ผ ํ๋ค. ์๋ํ๋ฉด ์ ๋ ฌ๋์ด ์์ด์ผ๋ง ๋ฐ์ดํฐ์ ์์น๋ฅผ ํน์ ํ๊ณ ์ค๋ณต ์ฌ๋ถ๋ฅผ ๋น ๋ฅด๊ฒ ํ์
ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ ์ ๋ ฌ์ ์ํ ์ถ๊ฐ ์์
์ด ํ์ ์๋ ๊ฒฝ์ฐ์ ํ์ํ ๊ฒฝ์ฐ๋ฅผ ๋๋ ์ ์ค๋ช
ํด๋ณด์.
A. ์ ๋ ฌ ์ถ๊ฐ ์์
์ด ํ์ ์๋ ๊ฒฝ์ฐ(index_merge_union)
๊ต์งํฉ ๋์ ๋๊ฐ์ ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ ํฉ์งํฉ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค๊ณ ํด๋ณด์.
SELECT *
FROM employees
WHERE first_name = 'Matt' OR hire_date = '1987-03-31'
๋ง์ฝ idx_first_name์ด๋ idx_hire_date๋ฅผ ๋จ๋
์ฌ์ฉํ๋ ๊ฒ์ ํํฐ๋ง ํจ๊ณผ๊ฐ ๋ฏธ๋ฏธํ ๊ฒฝ์ฐ, ์์ index_merge_union ๋ฐฉ์์ ํ์ฉํ ๊ฒ์ด๋ค.
์ด๋ ๋ ๋ณด์กฐ ์ธ๋ฑ์ค ๋ชจ๋ ๋๋ฑ ๋น๊ต์ด๊ธฐ ๋๋ฌธ์ ์ ํจํ ๋ ์ฝ๋๋ PK๊ฐ ์ ๋ ฌ๋ ํํ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ด๋ ๊ฒ ์ ๋ ฌ๋ ์ํ์ ์ ํจํ ๋ฐ์ดํฐ ์งํฉ์ ๋ฐ๋ก ์ถ๊ฐ ์ ๋ ฌ ์์
์์ด UNION ๋ณํฉ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ณํฉํ๋ฉด ๋๋ค.
์๋ฅผ ๋ค์ด ์ด๋ฆ ๋ณด์กฐ ์ธ๋ฑ์ค์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ๋ค.

์ด๋ฆ์ด '์ฌ์๋น'์ผ๋ก ๊ฐ์ ์ฌ๋๋ค ์ฌ์ด์ ์ฌ๋ฒ์ ์ ๋ ฌ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ๊ณ ์ฉ์ผ ๋ณด์กฐ ์ธ๋ฑ์ค๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
[!hint] ์ ์ ๋ ๊ฒ PK๊ฐ ์ ๋ ฌ๋์ด ์์๊น?
B-Tree์ ์ ์ฅ ํน์ฑ ๋๋ฌธ์ด๋ค. B-Tree๋ ์ผ์ชฝ์ ์๋ ์ปฌ๋ผ์ผ์๋ก ์ ๋ ฌ ์ฐ์ ์์๊ฐ ๋๋ค.
์๋ฅผ ๋ค์ด (col1, col2, co3) ์์ด๋ฉด, co1 ์์ผ๋ก ์ ๋ ฌ col1์ด ๊ฐ๋ค๋ฉด col2 ์ ์ ๋ ฌ, col2๋ ๊ฐ๋ค๋ฉด col3 ์์ผ๋ก ์ ๋ ฌ๋๋ค.๋ฐ๋ผ์ ์์ ์ฟผ๋ฆฌ๋ฌธ์ ๋๋ฑ ๋น๊ต์ด๊ธฐ ๋๋ฌธ์ ๋ณด์กฐ ์ธ๋ฑ์ค ์ปฌ๋ผ ํค๋ ๋์ผํ ๊ฒ์ด๋ฏ๋ก ํ์์์ธ PK ๊ฐ์ผ๋ก ์ ๋ ฌ๋ ์ํ์ผ ๊ฒ์ด๋ค.
B. ์ถ๊ฐ ์ ๋ ฌ ์์
์ด ํ์ํ ๊ฒฝ์ฐ (index_merge_sort_union)
explain
select * from employees
where first_name = 'Matt'
and hire_date Between '2025-01-01' and '2025-02-28'
์ด๋ฒ์ hire_date ๊ตฌ๋ฌธ์ ๋ฒ์ ์กฐ๊ฑด์ธ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๋น์ฐํ ๊ณ ์ฉ์ผ ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ง PK ์์ผ๋ก๋ ์ ๋ ฌ๋์ด ์์ง ์๋ค. ๋ฐ๋ผ์ index_merge๊ฐ ํ์ฉ๋๋ค๋ฉด, ํฉ์งํฉ ์ ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํด ์ธ๋ฑ์ค์์ ๋์จ ๋ชจ๋ ๋ฐ์ดํฐ ์งํฉ์ PK ์์ผ๋ก ์ ๋ ฌํ๋ ์์ ์ ๊ฑฐ์น๋ค.

4. ํต์ฌ ์์ฝ
index_merge์ ๋ต์ ํ๋์ ํ ์ด๋ธ์์ ๋ ๊ฐ ์ด์์ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ๋ ์ ๋ต์ด๋ค.- ์ฌ์ฉ ์กฐ๊ฑด์ ์ฟผ๋ฆฌ ๊ฐ๊ฐ์ ์กฐ๊ฑด์ด ์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์์ผ๋ฉฐ, ํ๋์ ์ธ๋ฑ์ค๋ฅผ ๋จ๋ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ์์๋ ํํฐ๋ง ํจ๊ณผ๊ฐ ๋ฏธ๋ฏธํ ๊ฒฝ์ฐ์ด๋ค.
- index_merge์ ์ข
๋ฅ์๋
๊ต์งํฉ(intersect),์ถ๊ฐ ์ ๋ ฌ ์์ ์๋ ํฉ์งํฉ,์ถ๊ฐ ์ ๋ ฌ ํ์ํ ํฉ์งํฉ์ผ๋ก ๋๋๋ค.- ๊ต์งํฉ์ ์ธ๋ฑ์ค๋ก ํํฐ๋งํ ๋ฐ์ดํฐ ์งํฉ ์ฌ์ด์ ๊ต์งํฉ์ ๋ฐํํ๋ค.
- ํฉ์งํฉ์ ์ธ๋ฑ์ค๋ก ํํฐ๋งํ ๋ฐ์ดํฐ ์งํฉ ์ฌ์ด์ ํฉ์งํฉ์ ๋ฐํํ๋๋ฐ ์ด๋ฅผ ์ํด์ ์ ๋ ฌ ์์
์ด ํ์ํ๋ค.
- ์ด๋ฏธ PK ์์ผ๋ก ์ ๋ ฌ๋์ด ์๋ค๋ฉด ์ถ๊ฐ ์ ๋ ฌ ์์ ์ด ํ์์์ง๋ง ์๋๋ผ๋ฉด ๋ชจ๋ ํ ์ด๋ธ์ ๊ดํด PK ์ ์ ๋ ฌ ์์ ์ ์ถ๊ฐ ์งํํ๋ค.
๋ถ๋ก
A. ๋ชจ๋ฅด๋ ๋จ์ด ์ ๋ฆฌ
B. ์ฐธ๊ณ ๋ฌธ์
- real-my-sql 329p - 334p