์ธ๋ฑ์ค (Index)
์ ์
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๊ฒ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์๋ฃ๊ตฌ์กฐ์
๋๋ค.
ํน์ง
โข
๊ฒ์ ์๋๊ฐ ํฅ์๋ฉ๋๋ค.
โข
์ ๋ ฌ ์์
์ ํจ์จ์ฑ์ด ์ฆ๊ฐํฉ๋๋ค.
โข
๋ฐ์ดํฐ ์ฝ์
, ์์ , ์ญ์ ์ ์ธ๋ฑ์ค๋ ํจ๊ป ์์ ๋์ด์ผ ํ๋ฏ๋ก ์ถ๊ฐ์ ์ธ ์์
์ด ํ์ํฉ๋๋ค.
โข
์ธ๋ฑ์ค ํ
์ด๋ธ์ ์ํ ์ถ๊ฐ์ ์ธ ์ ์ฅ ๊ณต๊ฐ์ด ํ์ํฉ๋๋ค.
โข
์ ์ ํ ์ธ๋ฑ์ค ์ค๊ณ๊ฐ ์ค์ํฉ๋๋ค.
์ฝ๋
1. ์ธ๋ฑ์ค ์์ฑ
-- ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค ์์ฑ
CREATE INDEX index_name ON table_name (column_name);
-- ๋ณตํฉ ์ปฌ๋ผ ์ธ๋ฑ์ค ์์ฑ
CREATE INDEX index_name ON table_name (column1, column2);
-- UNIQUE ์ธ๋ฑ์ค ์์ฑ
CREATE UNIQUE INDEX index_name ON table_name (column_name);
SQL
๋ณต์ฌ
2. ์ธ๋ฑ์ค ์ญ์
-- ์ธ๋ฑ์ค ์ญ์
DROP INDEX index_name ON table_name;
-- ์ฌ๋ฌ ์ธ๋ฑ์ค ์ญ์
ALTER TABLE table_name
DROP INDEX index_name1,
DROP INDEX index_name2;
SQL
๋ณต์ฌ
์ธ๋ฑ์ค ์ ๋ณด ํ์ธ:
-- ํ
์ด๋ธ์ ์ธ๋ฑ์ค ์ ๋ณด ํ์ธ
SHOW INDEX FROM table_name;
SQL
๋ณต์ฌ
INDEX ์์ฑ ์ ํ์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ํ์ธ
employees ํ
์ด๋ธ์ INDEX ์์ฑ ์ ํ์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ํ์ธํ๋ ค๋ฉด ์๋ ์ ์ฐจ๋๋ก ์งํํ๋ฉด ๋ฉ๋๋ค.
1. ์ธ๋ฑ์ค ์์ฑ ์์
์๋ฅผ ๋ค์ด last_name, gender ์ปฌ๋ผ์ผ๋ก ์์ฃผ ๊ฒ์ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:
CREATE INDEX idx_lastname_gender ON employees (last_name, gender);
SQL
๋ณต์ฌ
2. ์ฑ๋ฅ ์ฐจ์ด ํ์ธ ๋ฐฉ๋ฒ
1๋จ๊ณ: EXPLAIN ์ฌ์ฉ
EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith' AND gender = 'M';
SQL
๋ณต์ฌ
โข
์ธ๋ฑ์ค ์์ฑ ์ : type์ด ALL(Full Table Scan)์ด๊ณ , key๊ฐ NULL์ผ ์ ์์.
โข
์ธ๋ฑ์ค ์์ฑ ํ: type์ด ref ๋๋ range ๋ฑ์ผ๋ก ๋ฐ๋๊ณ , key์ idx_lastname_gender๊ฐ ํ์๋จ.
2๋จ๊ณ: SHOW STATUS ๋๋ SHOW PROFILE
SET PROFILING = 1;
-- ์ฟผ๋ฆฌ ์คํ
SELECT * FROM employees WHERE last_name = 'Smith' AND gender = 'M';
-- ํ๋กํ์ผ ํ์ธ
SHOW PROFILE FOR QUERY 1;
SQL
๋ณต์ฌ
Duration, CPU usage, sending data ๋ฑ์ ์๊ฐ ๋น๊ต ๊ฐ๋ฅ.
3. ์ฑ๋ฅ ์ฐจ์ด ์ฒดํฌ ํฌ์ธํธ
ํญ๋ชฉ | ์ธ๋ฑ์ค ์์ | ์ธ๋ฑ์ค ์์ |
type | ALL (Full Table Scan) | ref / range ๋ฑ (๋น ๋ฆ) |
rows | ํ
์ด๋ธ ์ ์ฒด | ์ถ๋ ค์ง ์์ ํ |
key | NULL | idx_lastname_gender ๋ฑ ํ์ |
์คํ ์๊ฐ | ์๋์ ์ผ๋ก ๋๋ฆผ | ๋ ๋น ๋ฆ |
์ค์ ํ
โข
์ค์ ๋ฐ์ดํฐ๊ฐ ๋ง์์๋ก ์ฑ๋ฅ ์ฐจ์ด๋ ๋ ์ปค์ง๋๋ค.
โข
์ธ๋ฑ์ค ์์ฑ์ด ๋ฌด์กฐ๊ฑด ์ข์ง๋ ์์: INSERT/UPDATE ์ฑ๋ฅ ์ ํ, ๋์คํฌ ๊ณต๊ฐ ์ฆ๊ฐ ๋ฑ์ ๋ถ์์ฉ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.