๐ ์ค๋ฌด์์ ์์ฃผ ๋ง์ฃผ์น๋ DB ์ธ๋ฑ์ค ์ฑ๋ฅ ์ด์์ ์ต์ ํ ์ ๋ต
์๋น์ค ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ์ฟผ๋ฆฌ ํ๋์ ํ ๋ ๊ฐ์ฅ ๋จผ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ธ๋ฑ์ค(Index)์
๋๋ค.
ํ์ง๋ง "์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ค๊ณ ๋ฌด์กฐ๊ฑด ๋น ๋ฅด๋ค"๋ ์คํด๋ ๋ง์๋ฐ์,
์ด๋ฒ ๊ธ์์๋ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ๋ ์ ์ํ ์ , ๋ณตํฉ ์ธ๋ฑ์ค ์ค๊ณ, GROUP BY ์ฟผ๋ฆฌ ์ต์ ํ๊น์ง ์ค์ ์ ์ฉ ๊ฐ๋ฅํ ํ์ผ๋ก ์ ๋ฆฌํด๋ด
๋๋ค.
โ
์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ ๋ ๊ณ ๋ คํ ์
MariaDB(MySQL)์์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค:
CREATE INDEX idx_column1 ON your_table (column1);
๋๋
ALTER TABLE your_table ADD INDEX idx_column1 (column1);
ํ์ง๋ง ๋์ฉ๋ ํ
์ด๋ธ์ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค ์ถ๊ฐ ์ ํ
์ด๋ธ ์ ๊ธ์ด ๋ฐ์ํ๊ฑฐ๋ ์ ์ด~์ ๋ถ ์ด์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
์ด ์์
์ด CRUD ์ฑ๋ฅ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง๋ ํจ๊ป ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
โ ์ธ๋ฑ์ค๊ฐ CRUD์ ๋ฏธ์น๋ ์ํฅ
| ํญ๋ชฉ | ์ํฅ ์ค๋ช |
|---|---|
| SELECT | ์ฑ๋ฅ ๋ํญ ํฅ์ (์ธ๋ฑ์ค ์ฌ์ฉ ์ ํ์ ๋ฒ์ ์ถ์) |
| INSERT | ์ธ๋ฑ์ค ์ถ๊ฐ๋ก ์ฐ๊ธฐ ์๋ ์ฝ๊ฐ ์ ํ (์ธ๋ฑ์ค๋ ๊ฐ์ด ๊ฐฑ์ ๋จ) |
| UPDATE/DELETE | ์กฐ๊ฑด์ ๋ฐ๋ผ ์ธ๋ฑ์ค๋ฅผ ์ฐ๋ฉด ๋น ๋ฅผ ์ ์์ง๋ง, ์ธ๋ฑ์ค๊ฐ ๋ง์์๋ก ์ ์ฒด ์ฒ๋ฆฌ ๋น์ฉ์ ์ฆ๊ฐํ ์ ์์ |
์ฑ๋ฅ ์ธก์ ๊ธฐ์ค:
EXPLAIN SELECT ...๋ก ์คํ ๊ณํ ํ์ธ
SHOW PROFILE, SHOW STATUS ๋๋ ์๋ต ์๊ฐ ์ธก์
Using index, Using where, Using filesort, Using temporary ๋ฑ ํํธ ํ์ธ
CREATE INDEX idx_name_age ON user (name, age);
์ด ์ธ๋ฑ์ค๋ (name) ๋จ๋ ์กฐ๊ฑด ๋๋ (name, age) ์กฐ๊ฑด์์ ํจ์จ์ ์ ๋๋ค.
๐ฏ Leftmost Prefix Rule
๋ณตํฉ ์ธ๋ฑ์ค๋ ์ผ์ชฝ์์๋ถํฐ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ์์๋ง ์ ์๋ํฉ๋๋ค.
| WHERE ์กฐ๊ฑด | ์ธ๋ฑ์ค ์ฌ์ฉ ์ฌ๋ถ |
|---|---|
| WHERE name = 'Tom' | โ ์ฌ์ฉ ๊ฐ๋ฅ |
| WHERE age = 30 | โ ์ฌ์ฉ ์ ๋จ |
| WHERE name = 'Tom' AND age = 30 | โ ์ ์ฒด ์ธ๋ฑ์ค ์ฌ์ฉ |
์ด ์์น์ ์งํค์ง ์์ผ๋ฉด ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๊ณ ๋ ์ฑ๋ฅ ํฅ์์ ์ป์ง ๋ชปํฉ๋๋ค.
| ํญ๋ชฉ | ๋จ์ผ ์ธ๋ฑ์ค | ๋ณตํฉ ์ธ๋ฑ์ค |
|---|---|---|
| ๊ตฌ์กฐ | ์ปฌ๋ผ ํ๋๋น ํ๋ | ์ฌ๋ฌ ์ปฌ๋ผ ๊ฒฐํฉ |
| ์ฟผ๋ฆฌ ์ฌ์ฉ์ฑ | ๋จ์ ์กฐ๊ฑด ์ฟผ๋ฆฌ ์ ํฉ | ๋ณตํฉ ์กฐ๊ฑด ์ฟผ๋ฆฌ์ ์ ๋ฆฌ |
| ์ฑ๋ฅ ์กฐ๊ฑด | ์ ์์๋ก ๋น ๋ฆ | ๋ค์ํ ์กฐ๊ฑด ์ต์ ํ ๊ฐ๋ฅ |
| ๋ณํฉ ๊ฐ๋ฅ์ฑ | Index Merge ํ์ฉ | Merge ๋์ ํ๋๋ก ์ต์ ํ |
โ
GROUP BY ์ฟผ๋ฆฌ์ ์ธ๋ฑ์ค์ ๊ด๊ณ
GROUP BY๋ ๋ด๋ถ์ ์ผ๋ก ์ ๋ ฌ(SORT)์ด๋ ์์ ํ
์ด๋ธ์ ์ฌ์ฉํฉ๋๋ค.
์ธ๋ฑ์ค๋ฅผ ์ ํ์ฉํ๋ฉด ์ด๋ฌํ ์ฐ์ฐ์ ์๋ตํ ์ ์์ด ์ฑ๋ฅ์ ํฌ๊ฒ ๋์ด์ฌ๋ฆด ์ ์์ต๋๋ค.
CREATE INDEX idx_dept_job ON employee (department_id, job_title);
SELECT department_id, job_title, COUNT(*)
FROM employee
GROUP BY department_id, job_title;
์ ์ฟผ๋ฆฌ๋ Using index for group-by ๋ก ์คํ๋๋ฉฐ, ๋ณ๋์ ์ ๋ ฌ ์์ด ์ธ๋ฑ์ค ์์๋๋ก ์ง๊ณ๋ฉ๋๋ค.
WHERE, JOIN, GROUP BY, ORDER BY ์ฟผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋จผ์ ํ์
์์ฃผ ์ฐ๋ ์ปฌ๋ผ + ์ ํ๋ ๋์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ณตํฉ ์ธ๋ฑ์ค ์ค๊ณ
EXPLAIN, SHOW PROFILE, slow_query_log ๋ฑ์ ํตํด ์ธ๋ฑ์ค ํ์ฉ ์ฌ๋ถ ํ์ธ
Using index, Using filesort, Using temporary ๋ฑ ํํธ ๋ถ์
ํ์ ์๋ ์ธ๋ฑ์ค๋ ์ ๋ฆฌํด์ ์ฐ๊ธฐ ์ฑ๋ฅ๋ ๊ณ ๋ คํ ๊ฒ
์ฟผ๋ฆฌ ํจํด์ ์ค์ฌ์ผ๋ก ์ค๊ณ๋ ์ธ๋ฑ์ค๋ ์ต๊ณ ์ ์ฑ๋ฅ ์ต์ ํ ์๋จ์ด๋ผ๋ ๊ฑธ ๊ธฐ์ตํ์ธ์!