์ธ๋ฑ์ค๋ ํ
์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๋์ฑ ๋น ๋ฅด๊ฒ ๊ฒ์(์กฐํ)
ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ์๋ฃ ๊ตฌ์กฐ
์ด๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํ๋ ๊ฐ์ ์ฐพ๋ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํด ๋ณด์.
์ธ๋ฑ์ค๊ฐ ์๋ ์ํฉ์์๋, Full Table Scan
์ ํด์ผ ํ๋ค.
Full Table Scan์ ํ๋ ๊ฒฝ์ฐ๋ ์๋์ ๊ฐ๋ค.
SELECT * FROM users WHERE age = 20;
SELECT * FROM users WHERE YEAR(birthdate) = 2000;
SELECT * FROM users WHERE name LIKE '%sangho%';
%
๊ฐ ๋ถ๋ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.sangho%
์ ๊ฐ์ด ๋ค์ ๋ถ๋ ๊ฒฝ์ฐ์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.B-Tree
์ด๊ธฐ ๋๋ฌธ์ธ๋ฐ, ํด๋น ๋ด์ฉ์ ์๋์์ ์์ธํ ์ค๋ช
ํ ์์ ์ด๋ค.SELECT * FROM users WHERE age > 5;
๐ง๐ปโ๐ป ์ฆ, ์ธ๋ฑ์ค๊ฐ ํญ์ ๋ ํจ์จ์ ์ด๋ผ๊ณ ๋งํ ์๋ ์๋ค. ์ด์ ๋ํด์๋ ์ดํ ๋ชฉ์ฐจ์์ ์ ๋ฆฌํ ์์ ์ด๋ค.
๊ณ ๋ ค ํญ๋ชฉ | ์ค๋ช |
---|---|
ํต๊ณ ์ ๋ณด (Statistics) | - ํ
์ด๋ธ ์ ์ฒด row ์ - ์ปฌ๋ผ๋ณ ๋ฐ์ดํฐ ๋ถํฌ - NULL/์ค๋ณต ์ฌ๋ถ - ์ธ๋ฑ์ค selectivity ๋ฑ |
์ธ๋ฑ์ค ์ ๋ฌด | - ์ธ๋ฑ์ค ์กด์ฌ ์ฌ๋ถ - ๋จ์ผ ์ธ๋ฑ์ค vs ๋ณตํฉ ์ธ๋ฑ์ค - Covering Index ์ฌ๋ถ |
์กฐ๊ฑด์ ํํ | - WHERE ์กฐ๊ฑด์์ ์ฌ์ฉํ๋ ์ฐ์ฐ์ ์ข
๋ฅ (LIKE, BETWEEN, =, <, != ๋ฑ) |
์กฐ์ธ ๋ฐฉ์ | - Nested Loop Join - Hash Join - Merge Join ๋ฑ ๋ค์ํ ์กฐ์ธ ์ ๋ต ๋น๊ต |
ํ์ํ ์์ | - ORDER BY, GROUP BY, ์ง๊ณ ํจ์ ๋ฑ ๋ถ๊ฐ ์ฐ์ฐ ์ฌ๋ถ - ์๋ธ์ฟผ๋ฆฌ ํฌํจ ์ฌ๋ถ |
๋์คํฌ ์ ๊ทผ๋ | - ์ ์ฒด ํ
์ด๋ธ vs ์ธ๋ฑ์ค ํ์ ์ I/O ๋น์ฉ ์ฐจ์ด - Random Access vs Sequential Access |
์ฌ๊ธฐ์ ํต๊ณ ์ ๋ณด - ์ธ๋ฑ์ค selectivity๋ ๋ฌด์์ผ๊น?
์กฐ๊ฑด | ์ ์ฒด row ์ | ์กฐ๊ฑด์ ํด๋นํ๋ row ์ | selectivity | ํจ์จ์ฑ |
---|---|---|---|---|
WHERE gender = 'M' | 1,000,000 | 500,000 | 0.5 | โ ๋ฎ์ ํจ์จ |
WHERE email = 'abc@example.com' | 1,000,000 | 1 | 0.000001 | โ ๋งค์ฐ ํจ์จ์ |
๊ฒฐ๊ณผ์ ์ผ๋ก ๋จ์ ์ ์๋์ ๊ฐ๋ค.
1. Full Table Scan์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฌด์กฐ๊ฑด ์ฝ๋๋ค
- ์กฐ๊ฑด์ ๋ง๋ row๊ฐ 10๊ฑด๋ง ์์ด๋, ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด 100๋ง row ์ ์ฒด๋ฅผ ์ฝ์ด์ผ ํ๋ค.
- ๋ฐ๋ฉด ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด, ๋ฑ 10๊ฑด๋ง ์ฐพ์์ ๋ฐ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
2. ๋์คํฌ I/O ๋น์ฉ ์ฐจ์ด๊ฐ ํฌ๋ค
- ์ธ๋ฑ์ค ํ์์ ํ์ํ ๋ธ๋ก๋ง ์ ๊ทผ (๋๋ค ์ก์ธ์ค, ์ ์ ์)
- Full Scan์ ๋ชจ๋ ๋ธ๋ก ์์ฐจ ์ ๊ทผ (์ํ์ , ๋ง๊ณ ๋ฌด๊ฑฐ์)
๊ทธ๋ ๋ค๋ฉด Index๋ ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก ํ์ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ผ๊น? ์ด๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํตํด ์ดํด๋ณผ ์ ์๋ค.
์ธ๋ฑ์ค ์ข ๋ฅ | ์ฌ์ฉ๋๋ ์๋ฃ๊ตฌ์กฐ | ์ฃผ์ ์ฉ๋ / ํน์ง | ์ฌ์ฉ ๊ฐ๋ฅ ์์ง |
---|---|---|---|
PRIMARY / INDEX / UNIQUE | B+Tree | ์ผ๋ฐ ์กฐํ, ๋ฒ์ ๊ฒ์, ์ ๋ ฌ ๋ฑ ๋ค์ฉ๋ | InnoDB (๊ธฐ๋ณธ) |
FULLTEXT | Inverted Index (์ญ์์ธ) | ์์ฐ์ด ๊ธฐ๋ฐ ํ
์คํธ ๊ฒ์ (MATCH ... ) | InnoDB |
SPATIAL | R-Tree | ๊ณต๊ฐ ์ขํ ๊ธฐ๋ฐ ๊ฒ์ (GIS ๋ฑ) | InnoDB |
HASH | Hash Table | ๋น ๋ฅธ ๋๋ฑ ๋น๊ต (= ) ๊ฒ์ ์ ์ฉ | MEMORY |
์์ ๊ฐ์ด MySQL Index๋ 4์ข
๋ฅ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ, ์ด๋ฒ ๊ธ์์๋ B+Tree
์ ๋ํด์๋ง ๋ค๋ฃจ๊ณ ์ ํ๋ค.
B+Tree๋ B-Tree์ ํ์ฅ ๊ฐ๋ ์ผ๋ก, ํธ๋ฆฌ์ ๋์ด๋ฅผ ์ต๋ํ ๋ฎ๊ฒ ์ ์งํ๋ฉฐ ํ์์ ์ฑ๋ฅ์ ๊ทน๋ํํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
B-Tree & B+Tree๊ฐ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ฐจ์ด์ ์ ๋ฌด์์ด ์๋์ง๋ ํด๋น ๊ธ์ ์ ๋ฆฌํด ๋์๋ค.
์ง๊ธ๊น์ง ์ธ๋ฑ์ค๊ฐ ์ ํ์ํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ ํ ์๋ฃ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋์ด ์๋์ง๊น์ง ์์๋ณด์๋ค.
ํ์ง๋ง ์ค์ง์ ์ผ๋ก ์ด๋ ํ ๋์ ๊ณผ์ ์ผ๋ก ์ํ๋ ๊ฐ์ ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์๋์ง๋ ์์ง ๊ฐ์ด ์ ์ค์ง ์๋๋ค. ์ง๊ธ๋ถํฐ๋ ์ด์ ๋ํด ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค.
์ ์ด๋ฏธ์ง๋ฅผ ํตํด์ ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค. ์ด๋ฏธ์ง ์ถ์ฒ
company_id
์ด๋ค.company_id = 18
์ธ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ธ๋ค.ํฌ์ธํฐ ๋ชฉ๋ก
์ ์ฐพ์๋ธ๋ค.์ฌ๊ธฐ์ ์๋์ ๊ถ๊ธ์ฆ๋ค์ด ์๊ธธ ์ ์๋ค.
MySQL InnoDB ๊ธฐ์ค์ผ๋ก, ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ(.ibd
) ํ์ผ ๋ด๋ถ์ ํจ๊ป ์ ์ฅ๋๋ค.
ํ
์ด๋ธ์ ๋ง๋ค๊ฒ ๋๋ฉด, ๋ณดํต ~.ibd
๋ผ๋ ํ์ผ์ด ํจ๊ป ์๊ธฐ๊ฒ ๋๋๋ฐ, ์ธ๋ฑ์ค ๊ตฌ์กฐ(B+Tree)๋ ๋ด๋ถ ํ์ด์ง ๋จ์ ๊ตฌ์กฐ์ ํจ๊ป ์ ์ฅ์ด ๋๋ค. (ํ์ด์ง ๋จ์์ ๋ํด์๋ ์ถํ ๋ฐ๋ก ๋ค๋ฃจ์ด ๋ณด๋ ค๊ณ ํ๋ค)
๋๋ฌธ์ ๋์ค์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ฒ ๋๋ค๋ฉด .ibd
ํ์ผ์ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ ์ฅ ๊ณต๊ฐ์ ์ผ๋ง๋ ์ฐจ์งํ๋์ง์ ๋ํด์๋ ์ ํํ ๊ณต์์ฒ๋ผ ๊ณ์ฐํ๊ธฐ๋ ์ด๋ ต๋ค. ์๋์ ๊ฐ์ ์์๋ค์ ์ํด์ ๋ณ๋์ฑ์ด ํฌ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ธ๋ฑ์ค ํค์ ๋ฐ์ดํฐ ํ์
- ์ธ๋ฑ์ฑ ๋์ row ์ (์ธ๋ฑ์ค๋ row ์๋งํผ ๋ฆฌํ ๋ ธ๋๋ฅผ ๊ฐ์ง๋ค)
- ์ธ๋ฑ์ค ํ์
- InnoDB ์ค์ (ํ์ด์ง ํฌ๊ธฐ ๋ฑ)
์ค์ ๋ก ํ์ธํด ๋ณด๊ณ ์ถ๋ค๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด์ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
SHOW TABLE STATUS LIKE {ํ
์ด๋ธ๋ช
};
์ฌ๊ธฐ์ Index_length
์ปฌ๋ผ์ด, ์ธ๋ฑ์ค๊ฐ ์ฐจ์งํ๋ ๋์คํฌ ์ฉ๋(byte)์ด ๋๋ค.
๊ทธ๋ ์ง ์๋ค.
ํ ์ด๋ธ ์คํค๋ง์ ์ปฌ๋ผ์ด ์ถ๊ฐ๋๋ ๊ฒ์ด ์๋๋ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ด ์์คํ ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฉํ ๋ฐ์ดํฐ๋ก ๋จ๊ธฐ ๋๋ฌธ์ด๋ค.
์ง๊ธ๊น์ง๋ ์ธ๋ฑ์ค์ ์ข์ ์ ๋ค์ ๋ํด์๋ง ๋์ดํ๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ชจ๋ ์ปฌ๋ผ์ ๋ํด์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ค๋ฉด ์กฐํ ์๋๊ฐ ๋งค์ฐ ๋นจ๋ผ์ง์ง ์์๊น?
ํ์ง๋ง ์ค์ ๋ก๋ ์ฌ๋ฌ ํ๊ณ์ ๋ค๋ ์กด์ฌํ๋ค.
์์์ ์ธ๊ธํ๋ ๊ฒ์ฒ๋ผ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ฉด .ibd ํ์ผ ๋ด๋ถ์ ๋ณ๋์ ์ธ๋ฑ์ค ๊ตฌ์กฐ๊ฐ ์ ์ฅ๋๋ค.
์ด๋ ์ฌ๋ฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ผ๋, ๋ณดํต ์ ์ฒด ํ
์ด๋ธ ํฌ๊ธฐ์ 5~25% ์์ค์ ์ฐจ์งํ๊ฒ ๋๋ค๊ณ ํ๋ค.
๋ํ ์ธ๋ฑ์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ์์ฑํ์ฌ ๋ณตํฉ ์ธ๋ฑ์ค๊ฐ ๋๋ ๊ฒฝ์ฐ์๋ ์ฐจ์งํ๋ ์ ๋๊ฐ ๋น ๋ฅด๊ฒ ์ฆ๊ฐํ๊ฒ ๋๋ค.
์ธ๋ฑ์ค๋ ์กฐํ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ๋ฐ ํนํ๋์ด ์๋ค. ๋ฐ๋ฉด ์ฐ๊ธฐ ์ฐ์ฐ(INSERT, UPDATE, DELETE)์ ๋ํด์๋ ์คํ๋ ค ์ฑ๋ฅ ์ ํ์ ์์ธ์ด ๋ ์ ์๋ค.
์ด๋ ์ฐ๊ธฐ ์ฐ์ฐ์ด ๋ฐ์ํ ๋๋ง๋ค, ํด๋น ์ธ๋ฑ์ค์๋ ๋์ผํ ๋ณ๊ฒฝ์ ๋ฐ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋๊ฑฐ๋ ์ญ์ ๋ ๋, ์ธ๋ฑ์ค์ ์ ์ฅ๋ B+Tree ๊ตฌ์กฐ ์ญ์ ํจ๊ป ๊ฐฑ์ ๋์ด์ผ ํ๋ฉฐ, ์ด๋ ์ถ๊ฐ ๋น์ฉ์ ๋ฐ์์ํจ๋ค.
๋ฐ๋ผ์ ์กฐํ ์ฑ๋ฅ์ ๊ทน๋ํํ๋, ์ฐ๊ธฐ ์ฑ๋ฅ๊ณผ์ Trade-Off๋ฅผ ๊ณ ๋ คํ ์ธ๋ฑ์ค ์ค๊ณ๊ฐ ์ค์ํ๋ค.
๋ง์ง๋ง์ผ๋ก ํจ์จ์ ์ธ ์ธ๋ฑ์ค ์์ฑ ์ ๋ต์ ๋ํด ์์ฑํ๋ฉฐ ๋ง๋ฌด๋ฆฌํ๋ ค๊ณ ํ๋ค.
1. WHERE, JOIN, ORDER BY์ ์์ฃผ ์ฌ์ฉ๋๋ ์ปฌ๋ผ
ํด๋น ์ปฌ๋ผ์ด ์กฐ๊ฑด์ , ์ ๋ ฌ, ์กฐ์ธ ๊ธฐ์ค์ผ๋ก ์์ฃผ ์ฌ์ฉ๋๋ค๋ฉด ์ธ๋ฑ์ค๋ฅผ ๊ณ ๋ คํ๋ฉด ์ข๋ค. ํนํ ๋์ฉ๋ ํ ์ด๋ธ์์์ ์กฐ๊ฑด ๊ฒ์์ ํจ๊ณผ์ ์ด๋ค.
SELECT * FROM users WHERE email = 'abc@example.com';
2. ๋ฐ์ดํฐ์ ์ ํ๋(Selectivity) ๊ฐ ๋์ ์ปฌ๋ผ
์ฆ, ๊ณ ์ ๊ฐ์ด ๋ง์(=์นด๋๋๋ฆฌํฐ๊ฐ ๋์) ์ปฌ๋ผ์ผ์๋ก ์ธ๋ฑ์ค ํจ์จ์ด ๋๋ค. (email, user_id ๋ฑ..)
๋ฐ๋ฉด, gender, is_active(T or F ์ด๊ธฐ์) ๊ฐ์ ์ปฌ๋ผ์ selectivity๊ฐ ๋ฎ๊ธฐ์ ๊ฑฐ์ ํจ๊ณผ๊ฐ ์๋ค.
3. FK(์ธ๋ ํค)๋ก ์์ฃผ ์กฐํ๋๋ ์ปฌ๋ผ
PK(Primary Key)๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ฑ์ค๊ฐ ์๋ ์์ฑ๋๋ค.
ํ์ง๋ง FK๋ ์ธ๋ฑ์ค๋ฅผ ์๋ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์,
FK ์ปฌ๋ผ์ ๋ํ WHERE ์กฐํ๋ JOIN์ด ๋น๋ฒํ๋ค๋ฉด ์๋์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ด์ผ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์๋ค.
4. UPDATE/DELETE๊ฐ ๋ง๋ค๋ฉด ์ต์ํ ๊ณ ๋ ค
์ฐ๊ธฐ ์ฐ์ฐ์ด ๋ง๊ณ , row๊ฐ ์์ฃผ ๋ฐ๋๋ ์ปฌ๋ผ์๋ ์ธ๋ฑ์ค ์์ฑ์ ์์ ํ๋ ๊ฒ์ด ์ข๋ค.
์๋ฅผ ๋ค์ด ์ํ์ ๋ฐ๋ผ ๊ฐ์ด ์์ฃผ ๋ฐ๋๋ status
์ปฌ๋ผ ๋ฑ์ ๋ถํ์ํ ์ธ๋ฑ์ค ๊ฐฑ์ ๋ถ๋ด์ด ํฌ๋ค.