โ๐[Backend Development] Covering Index.โ
๐ Intro
Covering Index(์ปค๋ฒ๋ง ์ธ๋ฑ์ค)๋ ์ฟผ๋ฆฌ ์คํ ์, ์ธ๋ฑ์ค๋ง์ผ๋ก ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ถฉ์กฑํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ฆ, ํ
์ด๋ธ(์๋ณธ ๋ฐ์ดํฐ)์ ์ ๊ทผํ์ง ์๊ณ ์ธ๋ฑ์ค๋ง์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ์ธ๋ฑ์ค์
๋๋ค.
โ 1๏ธโฃ Covering Index์ ํต์ฌ ๊ฐ๋ .
1๏ธโฃ ์ธ๋ฑ์ค ์ค์บ(Index Scan)๋ง์ผ๋ก ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํ.
- ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด๋ ์ผ๋ถ ์ปฌ๋ผ๋ง ๊ฒ์ํ ํ, ์ถ๊ฐ์ ์ผ๋ก ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์.
- ํ์ง๋ง Covering Index๋ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ธ๋ฑ์ค์ ํฌํจ๋์ด ์์ด, ํ ์ด๋ธ ์กฐํ๋ฅผ ์๋ตํ ์ ์์.
2๏ธโฃ ์ฟผ๋ฆฌ ์ฑ๋ฅ ์ต์ ํ.
- ๋์คํฌ I/O ๊ฐ์ : ํ ์ด๋ธ์ ์ฝ์ง ์์ผ๋ฏ๋ก I/O ๋น์ฉ ์ ๊ฐ.
- ์ฟผ๋ฆฌ ์๋ ํฅ์ : ์ธ๋ฑ์ค๋ง ์กฐํํ๋ฉด ๋๋ฏ๋ก ์คํ ์๋๊ฐ ๋นจ๋ผ์ง.
- Random I/O ๊ฐ์ : ํ ์ด๋ธ ๋ฐ์ดํฐ ์ ๊ทผ์ด ํ์ ์์ผ๋ฏ๋ก ๋ถํ์ํ I/O๋ฅผ ์ต์ํํจ.
โ 2๏ธโฃ Covering Index ๋์ ๋ฐฉ์.
๐ ์์ ํ ์ด๋ธ (MySQL ๊ธฐ์ค):
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
age INT,
city VARCHAR(100)
);
๐ ์ผ๋ฐ์ ์ธ ์ธ๋ฑ์ค ์ฌ์ฉ (ํ ์ด๋ธ ์กฐํ ํ์)
SELECT name FROM users WHERE age = 30;
- age ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์์ด๋, name ์ปฌ๋ผ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ํ ์ด๋ธ ์กฐํ(๋ฐ์ดํฐ ํ์ด์ง ์ ๊ทผ)๊ฐ ํ์ํจ.
๐ Covering Index ์ฌ์ฉ
CREATE INDEX idx_users_age_name ON users (age, name);
- ์ธ๋ฑ์ค(idx_users_age_name)๊ฐ age์ name ์ปฌ๋ผ์ ๋ชจ๋ ํฌํจํ๋ฏ๋ก, ํ ์ด๋ธ์ ์กฐํํ ํ์ ์์.
- ์ธ๋ฑ์ค์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฏ๋ก ์ฟผ๋ฆฌ ์๋๊ฐ ํฌ๊ฒ ํฅ์๋จ.
โ 3๏ธโฃ Covering Index ํ์ธ ๋ฐฉ๋ฒ (MySQL)
์ฟผ๋ฆฌ๊ฐ Covering Index๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธํ๋ ค๋ฉด EXPLAIN ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
EXPLAIN SELECT name FROM users WHERE age = 30;
- ๐ Extra ์ปฌ๋ผ์ โUsing indexโ๊ฐ ํ์๋๋ฉด Covering Index๊ฐ ์ ์ฉ๋ ๊ฒ ์ ๋๋ค.
๐ ๊ฒฐ๋ก
- โ Covering Index๋ ํ ์ด๋ธ์ ์กฐํํ์ง ์๊ณ , ์ธ๋ฑ์ค๋ง์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ์ต์ ํ ๊ธฐ๋ฒ
- โ ๋์คํฌ I/O์ Random I/O๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์
- โ ์ธ๋ฑ์ค ํฌ๊ธฐ๊ฐ ์ปค์ง ์ ์์ผ๋ฏ๋ก, ์ ์ ํ ์ปฌ๋ผ๋ง ํฌํจํ์ฌ ์์ฑํ๋ ๊ฒ์ด ์ค์.