์ด๋ฒ ๊ธ์์ MySQL 8.0๊ณผ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ์์ง์ธ InnoDB๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ณ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ฟผ๋ฆฌ ์ต์ ํ๋ฅผ ์งํํ ์์ ์ด๋ค.
INDEX์ ๋ํด ์ฒ์ ๋ค์ด๋ณด๊ฑฐ๋ ํ์ตํ๊ณ ์ถ๋ค๋ฉด ์๋ ๊ธ์ ์ฐธ๊ณ ๋ฐ๋
https://dgjinsu.tistory.com/38
1. ์คํ ๊ณํ
์คํ ๊ณํ๋ ์ ๋ง ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง ๊ฐ์ฅ ์ค์ํ๊ณ ๋ง์ด ๋์ค๋ 3๊ฐ์ง๋ ๋ค์๊ณผ ๊ฐ๋ค.
- all: ํ ์ด๋ธ ์ ์ฒด๋ฅผ ์ค์บ
full table scan์ ์๋ฏธํ๋ค. full table scan์ ํ๋ ๊ฒฝ์ฐ๋ ๋๊ฐ์ง๊ฐ ์๋ค.
1. ์ธ๋ฑ์ค๊ฐ ์์ด์ full table scan ํ๋ ๊ฒฝ์ฐ
2. ์ธ๋ฑ์ค๊ฐ ์์ง๋ง full table scan ํ๋ ๊ฒฝ์ฐ
๋๋ฒ์งธ ๊ฒฝ์ฐ๋ ์์ํ ์๋ ์์ง๋ง
์ธ๋ฑ์ค๊ฐ ์์ง๋ง ๋ฐ์ดํฐ ์ ์ฒด์ ๊ฐ์๊ฐ ์ผ๋ง๋์ง ์๊ฑฐ๋
์ธ๋ฑ์ค๊ฐ ์์ง๋ง ์ฝ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๊ฐ 25%๊ฐ ๋์ด๊ฐ๋ค๋ฉด full table scan์ด ์ผ์ด๋๋ค.
- range: ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ฌ ๋ฒ์ ๊ฒ์์ ํ ๋
์ด์์ ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ ๊ฑธ์์ ๋ ๋ํ๋๋ ์คํ ๊ณํ์ด๋ค. ํ์ํ ๋ถ๋ถ๋ง ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ disk io๋ฅผ ์ค์ผ ์ ์๋ค.
- index: ์ธ๋ฑ์ค ์ ์ฒด๋ฅผ ์ค์บํ ๋
์คํ ๊ณํ all ๊ณผ ์ ์ฌํ์ง๋ง data๋ฅผ ๋ค ์ฝ๋๊ฒ์ด ์๋ index๋ฅผ ์ ๋ถ ์ฝ๋ ๊ฒ์ด๋ค.
index๋ ๋ฐ์ดํฐ๋ณด๋จ ํ์ผ ํฌ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ full table scan๋ณด๋จ ์ฑ๋ฅ์ด ์ฐ์ํ๊ณ , ๋น์ฐํ range scan๋ณด๋ค๋ ์ฑ๋ฅ์ด ์ข์ง ๋ชปํ๋ค.
2.1 ์ธ๋ฑ์ค ์ ์ฉ ์ฌ๋ก
์๋ ์ฌ์ง๊ณผ ๊ฐ์ ํ ์ด๋ธ์ด ์์ ๋ ์ด๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ด์ผํ ๊น??
์ด์ index ๊ฒ์๊ธ์๋ ๋์์์์ง๋ง ์๋ ๋๊ฐ์ง ์ ๋๋ก ๊ธฐ์ค์ ์ ํ ์ ์๋ค.
1. ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ ์ปฌ๋ผ์ ๋ํด ์ธ๋ฑ์ค๋ฅผ ์์ฑ
2. ์๋น์ค์ ํน์ฑ์ ๋ฌด์์ ๋ํ ์กฐํ๊ฐ ๋ง์ด ์ผ์ด๋๋์ง ํ์
nickname์ ๋ํ ์กฐํ๊ฐ ๋ง์ด ์ผ์ด๋๊ณ nickname ์ปฌ๋ผ์ ์นด๋๋๋ฆฌํฐ ๋ํ ๋๋ค๊ณ ๊ฐ์ ํ๊ณ ์งํํ๊ฒ ๋ค.
- ๋๋ฏธ๋ฐ์ดํฐ insert
์คํ์ ์์ dummy data๋ฅผ ๋ฃ์ด์ค์ผํ๋ค.
๋๊ฐ์ ๊ฒฝ์ฐ mysql workbench๋ฅผ ํตํด sql๋ฌธ์ ์คํ์์ผ 10๋ง๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
DELIMITER $$
DROP PROCEDURE IF EXISTS loopInsert$$
CREATE PROCEDURE loopInsert()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 100000 DO
INSERT INTO crew(id, nickname, track, age)
VALUES(i, concat('dgjinsu',i), 'backend', FLOOR(RAND() * 11) + 20);
SET i = i + 1;
END WHILE;
END$$
DELIMITER $$
CALL loopInsert;
- ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ง ์์์ ๋ (์คํจ ์ฌ๋ก)
SELECT * FROM test.crew c where c.nickname < "dgjinsu50000";
์์ ๊ฐ์ด nickname์ ์กฐ๊ฑด์ ๋ก ๋๊ณ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด์๋ค.
์ด ๊ฑธ๋ฆฐ ์๊ฐ์ 0.109sec ์๋ชจ๋์๊ณ ์คํ๊ณํ์ ALL๋ก ๋ํ๋ฌ๋ค
- ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์์ ๋ (์คํจ ์ฌ๋ก)
create index idx_crew_nickname ON test.crew (nickname);
create index๋ฌธ์ผ๋ก nickname์ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ด์ฃผ๊ณ ๋ค์ ๋๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด์.
๋๊ฐ์ด ALL์ด ๋์๋ค. ์ ๊ทธ๋ด๊น?
์๊น ์์์๋ ๋งํ๋ฏ์ด ์ธ๋ฑ์ค๊ฐ ์์ง๋ง ์ฝ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๊ฐ 25%๊ฐ ๋์ด๊ฐ๋ค๋ฉด full table scan์ด ์ผ์ด๋๋ค. 10๋ง๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋์๊ณ 5๋ง๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋น์ฐํ ์คํ ๊ณํ์ด ALL์ด ๋์๋ค.
- ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ง ์์์ ๋
์ด๋ฒ์ 100๋ง๊ฑด์ ๋ฐ์ดํฐ๋ก ๋๋ฆฌ๊ณ ์ด๋ฒ์ age๊ฐ 21 ๋ฏธ๋ง์ธ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฝ 9๋ง๊ฑด์ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋์๊ณ 0.984 sec์ด ๊ฑธ๋ ธ๋ค.
์คํ ๊ณํ์ ์ญ์ ALL ์ด๋ค.
- ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์์ ๋
CREATE INDEX idx_crew_age ON test.crew (age);
์ด๋ฒ์ age์ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ด์ฃผ๊ณ ๋ค์ ๋๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด์.
๋๊ฐ์ด 9๋ง๊ฑด์ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋์๊ณ 0.719 sec์ด ๊ฑธ๋ ธ๋ค.
์คํ ๊ณํ์ range๋ก ๋ฐ๋์๋ค.
rows๋ ํ์ธํ๋ row์ ์ ์ด๋ค. ์ธ๋ฑ์ค๋ฅผ ๊ฑธ๊ธฐ ์ ์ 997090 ํ์ ํ์ํ์ง๋ง ์ด๋ฒ์ 181552์ ํ์ ํ์ํ๋ค.
2.2 ์ธ๋ฑ์ค ์ ์ฉ ์ฌ๋ก
- ๋ณตํฉ ์ธ๋ฑ์ค๋?
๋๊ฐ ์ด์์ ์ปฌ๋ผ์ ํฉ์ณ์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
ํ๋์ ์ปฌ๋ผ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์์ ๋ ๋ณด๋ค ๋ ์ ์ ๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ๋ณด์ฌ ํ์ํ ๋ฐ์ดํฐ ์๊ฐ ์ค์ด๋ฌ
๊ฒฐํฉ ์ธ๋ฑ์ค, ๋ค์ค ์ปฌ๋ผ ์ธ๋ฑ์ค, Composite Index๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ์ ๋ ฌ๋๋ค.
age, nickname ๋ ์ปฌ๋ผ์ ๋ณตํฉ ์ธ๋ฑ์ค๋ก ์ ์ํ ์์์ด๋ค.
๋ณตํฉ ์ธ๋ฑ์ค๋ ์กฐ์ฌํ ์ฌ์ฉํด์ผ ํ๋ค.
๋ง์ฝ age๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฐ๋ค๋ฉด ๊ทธ๋ฅ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์์ ๋์ ๋น์ทํ ์ฑ๋ฅ์ ๋ณด์ผ ๊ฒ์ด๋ค.
age์ nickname์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฐ๋ค๋ฉด ๊ธฐ์กด๋ณด๋ค ํจ์ฌ ์ข์ ์ฑ๋ฅ์ ๋ณด์ผ ๊ฒ์ด๋ค.
ํ์ง๋ง nickname๋ง์ ์กฐ๊ฑด์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฐ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น??
์ ์ฌ์ง์์ ๋ณผ ์ ์๋ฏ์ด ์ ์ฒด์ ์ผ๋ก ๋ณด๋ฉด nickname์ ์ ์ด๋์ด์์ง ์๋ค. ๊ฐ์ age์ ํ์์๋ง ์ ๋ ฌ๋ ํํ์ด๋ค.
๋ฐ๋ผ์ full table scan์ด ์ผ์ด๋๋ค.
๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
CREATE INDEX idx_crew_age_nickname ON test.crew (age, nickname);
2.3 ์ธ๋ฑ์ค ์ ์ฉ ์ฌ๋ก
- ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋?
์ธ๋ฑ์ค๋ก ์ค์ ํ ์ปฌ๋ผ๋ง ์ฝ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์๋ ์ธ๋ฑ์ค์ด๋ค.
๋ถํ์ํ ๋์คํฌ I/O๋ฅผ ์ค์ฌ ์กฐํ ์๊ฐ์ ๋จ์ถํ ์ ์๋ค.
์ธ๋ฑ์ค ์ ์ฉ ์ฌ๋ก 2.1 ์์ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์์ง๋ง 20% ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ผ ํ๋ ์ผ์ด ์๊ฒจ full table scan์ด ์ผ์ด๋ฌ์๋ค.
์ด๋ฅผ ์ธ๋ฑ์ค๋ง ์ฝ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
ํ์ฌ nickname์ ์ธ๋ฑ์ค๋ก ๊ฑธ์ด๋์๋ค.
๋ค์๊ณผ ๊ฐ์ด ์กฐํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น??
explain SELECT * FROM test.crew c where c.nickname < "dgjinsu9";
dgjinsu1.. ๋ถํฐ dgjinsu9.. ๊น์ง ์๊ธฐ ๋๋ฌธ์ 90% ๊ฐ๋์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ฒฝ์ฐ์ด๋ค.
์คํ ๊ณํ์ ์ดํด๋ณด๋ฉด ์ญ์ ALL์ด๋ค.
์ฌ๊ธฐ์ select ์ ์ ์ธ๋ฑ์ค๋ง ์กฐํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๋ค.
explain SELECT c.nickname FROM test.crew c where c.nickname < "dgjinsu9";
์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ฅผ ํ๊ฒ ๋๋ฉด Extra ์ปฌ๋ผ์ Using index๊ฐ ํ์๋๋ค.
pk ๊ฐ์ธ id๋ ํจ๊ป ์กฐํํ๋ค๋ฉด ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ์ผ์ด๋ ๊น?
๋ง์ฐฌ๊ฐ์ง๋ก type์ range์ด๊ณ Extra์ Using index๊ฐ ๋ํ๋๋ค.
๋ณตํฉ ์ธ๋ฑ์ค๋ก ์ค์ ํ์ง ์์๋๋ฐ ์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ ๊ฒ์ผ๊น??
์ด์ ๋ InnoDB์ ์ธ์ปจ๋๋ฆฌ ์ธ๋ฑ์ค์ ํน์ํ ๊ตฌ์กฐ ๋๋ถ์ด๋ค.
๋ฆฌํ ๋ ธ๋์๋ ์ค์ ๋ ์ฝ๋ ์ฃผ์๊ฐ ์๋ ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ฆฐ PK๋ฅผ ์ฃผ์ ๊ฐ์ง๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ nickname, id ๋ชจ๋ ํ์ฉ ๊ฐ๋ฅํ๋ ๊ฒ์ด๋ค.
2.4 ์ธ๋ฑ์ค ์ ์ฉ ์ฌ๋ก
- ์ธ๋ฑ์ ์ปจ๋์ ํธ์๋ค์ด
์๋์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฐ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ธ๋ฑ์ค๋ type ๊ธฐ์ค์ผ๋ก ์์ฑํ๋ค.
์คํ ๊ณํ์ ๋ค์๊ณผ ๊ฐ๊ณ ์ธ๋ฑ์ค๋ฅผ ์ ํ๊ฑธ ๋ณผ ์ ์๋ค. ํ์ง๋ง Extraํญ์ ์ดํด๋ณด๋ฉด Using where๋ก ํ์๋๋ค.
Extra์ปฌ๋ผ์๋ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์์ ์ฑ๋ฅ์ ๊ด๋ จ๋ ์ค์ํ ๋ด์ฉ์ด ํ์๋๋ค. ๋ด๋ถ์ ์ธ ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์กฐ๊ธ ๋ ๊น์ ๋ด์ฉ์ ํฌํจํ๋ค.
Using where ๋,
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํตํด ํ ์ด๋ธ์์ ํ์ ๊ฐ์ ธ์จ ๋ค, MySQL ์์ง์์ ์ถ๊ฐ์ ์ธ ์ฒดํฌ ์กฐ๊ฑด์ ํ์ฉํ์ฌ ํ์ ๋ฒ์๋ฅผ ์ถ์ํ ๊ฒ์ด๋ค.
์ด๊ฑธ ๊ทธ๋ฆผ์ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ธ๋ฑ์ค๋ก ๊ฑธ๋ฆฐ 50๋ง๊ฐ์ ๋ฐ์ดํฐ๋ฅผ mysql์์ง์ผ๋ก ์ ๋ฌํ๊ณ ์ธ๋ฑ์ค์ ๊ฑธ๋ฆฌ์ง ์์ created_at ์กฐ๊ฑด์ ๋ํด 9์ฒ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๋ค. mysql์์ง์ ์ ์ฅ์์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์์ ๋ถํ์ํ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๊ฒ์ด๋ค.
์ด๋ฅผ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ํตํด ๊ฐ์ ๊ฐ๋ฅํ๋ค.
type, created_at ์ผ๋ก ๋ณตํฉ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ณ ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์คํ๊ณํ์ ํ์ธํ ์ ์๋ค.
Extra ์ปฌ๋ผ์ Using Index Condition์ ์ธ๋ฑ์ค ์ปจ๋์ ํธ์๋ค์ด ์ผ๋ก ์ธํด ํ์๋๋ค.
์ธ๋ฑ์ค ์ปจ๋์ ํธ์๋ค์ด(ICP, Index Condition Pushdown)์ด๋, MySQL์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ์์ ํ์ ๊ฒ์ํ๋ ๊ฒฝ์ฐ์ ์ต์ ํ๋ฅผ ์๋ฏธํ๋ค.
ICP๋ฅผ ํ์ฑํํ๊ณ ์ธ๋ฑ์ค์ ์ปฌ๋ผ๋ง ์ฌ์ฉํ์ฌ where ์กฐ๊ฑด์ ์ผ๋ถ๋ฅผ ํ๊ฐํ ์ ์๋ ๊ฒฝ์ฐ MSQL์์ง์ where ์กฐ๊ฑด ๋ถ๋ถ์ ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก ํธ์ํ๋ค.
ICP๋ ์ต์ ๋ฒ์ ์ MySQL์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋จ.
์ ๊ณผ์ ์ ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ฐธ๊ณ
'DB ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[replication] mysql Replication ์ผ๋ก DB ๋ถํ ๋ถ์ฐ ์ํค๊ธฐ (0) | 2024.04.11 |
---|---|
[Neo4j] Graph Database๋? RDBMS์ ๋น๊ต, neo4j ๋์ ์ด์ (1) | 2024.03.27 |
[Redis] redis์์ ๋ฐ์ดํฐ ์๊ตฌ ์ ์ฅํ๋ ๋ฐฉ๋ฒ (RDB / AOF) (0) | 2024.03.09 |
[Lock] DB Lock & JPA Lock ์ฝ๋๋ก ์ดํด๋ณด์ (MySQL) (0) | 2024.02.20 |
[Index] ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค ํํค์น๊ธฐ (0) | 2024.02.18 |