์ธ๋ฑ์ค๋ ์ถ๊ฐ์ ์ธ ์ฐ๊ธฐ ์์ ๊ณผ ์ ์ฅ ๊ณต๊ฐ์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๊ฒ์ ์๋๋ฅผ ํฅ์์ํค๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๊ฐ Java ํ๋ก๊ทธ๋๋ฐ ์ฑ ์์ Stream์ด ๊ถ๊ธํ์ฌ ์ฐพ์๋ณธ๋ค๊ณ ํ์ ๋, ์ฑ ์ ๋งจ ๋ทํธ์ ์์ธ์ผ๋ก ์ชฝ ๋ฒํธ์ ํจ๊ป ๋ณ๋๋ก ๋ฐฐ์ดํด๋์ ํญ๋ชฉ์ ํตํด ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค.
DB์์๋ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ๋ฌผ๋ฆฌ์ ์์น๋ฅผ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํตํด ์กฐํํ ์ ์๋๋ก ๋๋ ์ธ๋ฑ์ค๊ฐ ์๋ค.
์ค์ DB ๊ด๋ จ ์์ ์ ํ ๋ ๋๋ถ๋ถ ์๋ ์ ํ์ ์์ธ์ ์กฐํ(Select)์ Where๋ฌธ์์ ๋ฐ์ํ๋๋ฐ, ๊ฐ์ฅ ๋จผ์ ์๊ฐํด๋ณผ ์ ์๋ ๋์์ผ๋ก Index๋ฅผ ์๊ฐํ ์ ์๋ค.
์ด ๋ถ๋ถ์ ํ์คํ์ง ์์ง๋ง, ์กฐ์ฌ์ค๋ ์ถ์ธกํด๋ณด์๋ฉด, C์ธ์ด๊ฐ ๋ค๋ฅธ ์ธ์ด์ ๋นํด์ โํฌ์ธํฐโ๋ผ๋ ๊ฐ๋
๋๋ฌธ์ ์กฐ๊ธ ์ด๋ ต๊ฒ ๋๊ปด์ง๋ค. ํ์ง๋ง ์ด๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์น๋ฅผ ํ ๋นํด์ฃผ๊ธฐ ๋๋ฌธ์ ์๋ ์ธก๋ฉด์์๋ ๋ค๋ฅธ ์ธ์ด์ ๋นํด ๋งค์ฐ ๋น ๋ฅด๋ค. ์ด๋ฌํ ๊ฐ๋
์ผ๋ก DB ์ธ๋ฑ์ค๋ฅผ ์ดํดํ๋ ์ข ๋ ์์ํ์๋ค.
//mysql
CREATE INDEX USER_COMPANY_INDEX ON USER(COMPANY_ID);
์ฃผ์์ ์ ์์๋ณด๊ธฐ ์ ์, CRUD์ ๋ฏธ์น๋ ์ํฅ์ ๋จผ์ ์ดํด๋ณด์.
READ โ ์ ๊ทธ๋ฆผ์์ ์ดํด๋ณด์๋ ๊ฒ์ฒ๋ผ ๊ฐ ํ ์ด๋ธ์ ์ ๊ทผํ๊ธฐ ์ํ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํด๋๊ณ , ์ด๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๋น์ ๋ฐํ๋ค.
UPDATE, DELETE โ WHERE ์ ์ ์ ์ค์ ๋ ์ธ๋ฑ์ค๋ก ์กฐ๊ฑด์ ๋ถ์ฌ์ฃผ๋ฉด ์กฐํํ ๋ ์ฑ๋ฅ์ ํฌ๊ฒ ์ ํ๋์ง ์๋๋ค. (๋จ, ์ด๋ ์์ ๋ฐ ์ญ์ ๋ฅผ ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋ ์๋๊ฐ ๋นจ๋ผ์ง๋ ๊ฒ์ด๊ณ , ์์ ๋ฐ ์ญ์ ์์ฒด์ ์๋๊ฐ ๋นจ๋ผ์ง๋ ๊ฒ์ ์๋!)
CREATE โ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ฉด์ ๊ธฐ์กด์ ์ธ๋ฑ์ค ํ์ด์ง์ ์ ์ฅ๋์ด ์๋ ํ์ ์์น๊ฐ ์์ ๋๊ธฐ ๋๋ฌธ์ ํจ์จ์ด ์ข์ง ๋ชปํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ Index๋ฅผ ํญ์ ์ต์ ์ ์ ๋ ฌ ์ํ๋ก ์ ์งํด์ผ ์ํ๋ ๊ฐ์ ๋น ๋ฅด๊ฒ ์ป์ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋ ์ปฌ๋ผ์ INSERT, UPDATE, DELETE๊ฐ ์ํ๋๋ค๋ฉด ๊ฐ๊ฐ ๋ค์๊ณผ ๊ฐ์ ์ฐ์ฐ์ ์ถ๊ฐ์ ์ผ๋ก ํด์ฃผ์ด์ผ ํ๋ฉฐ ๊ทธ์ ๋ฐ๋ฅธ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค.
๋ฌด์กฐ๊ฑด ๋ง์ด ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ๋ ๊ฒ์ ์คํ๋ ค ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์๋ค. ๊ทธ ์ด์ ๋ก ๋ฐ๋ก ์์ ์๋ ๋ฌธ๋จ์ ์ฐธ๊ณ ํ๋ฉด ๋๋๋ฐ, ์์ , ์ฝ์ , ์ญ์ ๋ฅผ ํ ๋ ๋ฐ์ํ๋ ์ค๋ฒํค๋๊ฐ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ ์ธ๋ฑ์ค๋ DB ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ ํํ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค์ ๊ฐ์์ ์ ์ฅ ๊ณต๊ฐ์ด ๋น๋กํ๋ค. ์ฆ ์ธ๋ฑ์ค๋ฅผ ๋ง์ด ์ค์ ํ๋ฉด, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์ ์ฅ ๊ณต๊ฐ์ด ๋์์ ธ ์ฑ๋ฅ ์ ํ์ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
์นด๋๋๋ฆฌํฐ(Cardinality)๊ฐ ๋๊ณ ํ์ฉ๋๊ฐ ๋์ ์๋ก ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ๊ธฐ ์ข์ ์ปฌ๋ผ์ด๋ค!
๋ํ ๊ท๋ชจ๊ฐ ํฐ ํ ์ด๋ธ์ด๋ INSERT, UPDATE, DELETE๊ฐ ์์ฃผ ๋ฐ์ํ์ง ์๋ ์ปฌ๋ผ์์ ์ฌ์ฉํ๊ธฐ ์ ํฉํ๋ค.
- DB์์ ์นด๋๋๋ฆฌํฐ๋ ์ปฌ๋ผ์ ๊ณ ์ ํ ๊ฐ์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ์์น๋ค.
์๋ฅผ ๋ค์ด, โ์ปคํผโ๋ผ๋ ํ ์ด๋ธ์ด ์๊ณ , โ๋ฉ๋ด๋ช โ์ด๋ผ๋ ์ปฌ๋ผ์ด ์์ ๋,
- ์๋ฉ๋ฆฌ์นด๋ ธ
- ์นดํ๋ผ๋ผ
- ์ฝ๋๋ธ๋ฃจ
- ์๋ฉ๋ฆฌ์นด๋ ธ
- ์์ธ์ํ๋
์ ์นด๋๋๋ฆฌํฐ๋ 4๋ค. ๊ณ ์ ํ ์ปฌ๋ผ์ด ์ด 4๊ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์นด๋๋๋ฆฌํฐ๊ฐ ๋ฎ์์๋ก(์๋ฉ๋ฆฌ์นด๋ ธ๊ฐ 5์ ์๋ค๊ณ ์๊ฐ) ์ธ๋ฑ์ค๊ฐ ์ค๋ณต๋ ๊ฐ๋ค์ ๊ฐ์ง๊ฒ ๋๋ฏ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๊ฐ์ ์ฐพ๋ ๊ฒ์ด ๋นํจ์จ์ ์ผ ์ ์๋ค.
์ ์ฒด์ ์ผ๋ก ์ ๋ด์ฉ์ ์ ๋ฆฌํ์๋ฉด ์๋์ ๊ฐ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ค๊ณํ๋ค๋ฉด WHERE
์ ์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ์๊ฐํ์ง๋ง, ์ค์ ๋ก๋ ์ฟผ๋ฆฌ ์ ์ฒด์ ๋ํ ์ธ๋ฑ์ค ์ค๊ณ๊ฐ ํ์ํ๋ค
์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฐพ๋ ๋ฐฉ๋ฒ์ด์ง๋ง, ์ด๋ฅผ ์ ํ์ฉํ๋ค๋ฉด ์ค์ ๋ฐ์ดํฐ๊น์ง ์ ๊ทผํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ฌ ์ ์๋ค.
์ฟผ๋ฆฌ๋ฅผ ์ถฉ์กฑ์ํค๋๋ฐ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ธ๋ฑ์ค๋ฅผ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค(Covering Index)๋ผ ํ๋ค.
์ฟผ๋ฆฌ์ ๋งจ ์์ EXPLAIN
์ ๋ถํ ์คํํ๋ฉด, ์์ธํ ์คํ ๊ณํ์ ํ์ธํ ์ ์๋ค.
EXPLAIN
SELECT *
FROM board.member m
WHERE m.member_id < 10;
๋์ | ์ ํ | |
---|---|---|
Non-clustered Key | ์ผ๋ฐ์ ์ธ ์ธ๋ฑ์ค | ํ ์ด๋ธ์ ์ฌ๋ฌ๊ฐ ์์ฑ ๊ฐ๋ฅ |
Clustered Key | (1)PK (2) PK๊ฐ ์์ ๋, Unique Key(3) ๋ ๋ค ์๋ค๋ฉด, 6bytes์ Hidden Key ์์ฑ | ํ ์ด๋ธ๋น 1๊ฐ๋ง ์์ฑ ๊ฐ๋ฅ |
Non-clustered Key๋ age์ Clustered Key๋ PK์ ๊ฑธ๋ ค์๋ ์ํฉ
MYSQL์์๋ Non Clustered Key์ Clustered Key๊ฐ ํญ์ ํฌํจ๋์ด ์๋ค. ์ด์ ๋ Non Clustered Key์๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ์์น๊ฐ ์๊ธฐ ๋๋ฌธ
๋ฐ๋ผ์, ์ธ๋ฑ์ค ์กฐ๊ฑด์ด where ๊ฒ์ ์กฐ๊ฑด์ ์๋๋ผ๋ Clustered Key ๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
๋ง์ฝ PK๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ์ธ๋ฑ์ค ํ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ ๋น ๋ฅด๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ ์ค์ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ง ์๊ณ ์ธ๋ฑ์ค์ ์กด์ฌํ๋ ์ปฌ๋ผ ๊ฐ๋ง์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํ ์คํธ์ฉ ๋ฐ์ดํฐ๋ก ์๋์ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง๋ ์ฝ 20๋ง๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค.
CREATE INDEX 'idx_member_idx' ON 'test_member' (email);
๋จผ์ ์๋์ ์ฟผ๋ฆฌ ์คํ ๊ณํ์ ์ดํด๋ณธ๋ค.
EXPLAIN
SELECT *
FROM test_member
WHERE email = 'test20@gmail.com';
๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ์ *๋ฅผ email๋ก ๋ณ๊ฒฝํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
EXPLAIN
SELECT email
FROM test_member
WHERE email = 'test20@gmail.com';
extra
๋ฅผ ํ์ธํด๋ณด๋ฉด, using index
๋ก ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ๋ ๊ฒ์ ํ์ผ ํ ์ ์๋ค.
GROUP BY
๋ ์๋์ ์กฐ๊ฑด์์ ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋๋ค.
--- ์ธ๋ฑ์ค๊ฐ (a, b, c)์ธ ๊ฒฝ์ฐ
GROUP BY b --- ์ธ๋ฑ์ค ์ ์ฉ X
GROUP BY b, a --- ์ธ๋ฑ์ค ์ ์ฉ X
GROUP BY a, c, b --- ์ธ๋ฑ์ค ์ ์ฉ X
GROUP BY a --- ์ธ๋ฑ์ค ์ ์ฉ O
GROUP BY a, b --- ์ธ๋ฑ์ค ์ ์ฉ O
GROUP BY a, b, c --- ์ธ๋ฑ์ค ์ ์ฉ O
GROUP BY b, c --- ์ธ๋ฑ์ค ์ ์ฉ X
GROUP BY a, b, c, d --- ์ธ๋ฑ์ค ์ ์ฉ X
ํ์ต์ ์ํด (email, PK, age)๋ก ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ค.
CREATE INDEX `idx_member_email_id_age` ON `test_member` (email, member_id, age);
๊ทธ๋ฆฌ๊ณ ์๋ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ๊ณผ ์ํ ์๊ฐ์ ํ์ธํ๋ค.
SELECT *
FROM test_member
WHERE email LIKE 'test20%'
GROUP BY member_id, age;
extra
๋ฅผ ํ์ธํด๋ณด๋ฉด, using where
์ด ์ฌ์ฉ๋ ๊ฒ์ ํ์ผ ํ ์ ์๋ค. ์ค์ ์ํ ์๊ฐ์ ์ฝ 0.01sec
์ด ๋์๋ค.
์ด๋ฒ์ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด๋ณด์.
SELECT email, member_id, age
FROM test_member
WHERE email LIKE 'test20%'
GROUP BY member_id, age;
extra
๋ฅผ ํ์ธํด๋ณด๋ฉด, using index
์ด ์ฌ์ฉ๋ ๊ฒ์ ํ์ผ ํ ์ ์๋ค. ์ค์ ์ํ ์๊ฐ์ ์ฝ 0.0025sec
์ด ๋์๋ค.
์ฝ 4๋ฐฐ ๋จ์ถ๋์๋ค.
์กฐํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ๋, ์ธ๋ฑ์ค ์ ์ฉ ์กฐ๊ฑด์ ์ ์์งํ์ฌ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค
๋ฅผ ํ์ฉํ๋ฉด ์ฑ๋ฅ ๊ฐ์ ์ ๋์์ ์ค ์ ์๋ค.
์ฐธ์กฐ
https://mangkyu.tistory.com/96
https://tecoble.techcourse.co.kr/post/2021-10-12-covering-index/
https://jojoldu.tistory.com/476
https://jojoldu.tistory.com/481