Home
>
DB
>
๐พ[Database] Covering Index๋ ๋ฌด์์ผ๊น์?
Database
Native SQL Query
MySQL
โ๐พ[Database] Covering Index๋ ๋ฌด์์ผ๊น์?โ
๐ Intro.
- ์ฟผ๋ฆฌ๊ฐ ์์ฒญํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ธ๋ฑ์ค์ ํฌํจ๋์ด ์์ด, ํ
์ด๋ธ์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์ง ์๊ณ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์๋ ์ธ๋ฑ์ค๋ฅผ ๋งํฉ๋๋ค.
- ์ฆ, ์ธ๋ฑ์ค๋ง์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ Covering Index๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
- ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
โ
1๏ธโฃ Covering Index์ ๋์ ๋ฐฉ์.
-
1. ์ผ๋ฐ์ ์ธ ์ธ๋ฑ์ค ์ฌ์ฉ:
- ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ฉด ๋จผ์ ์ธ๋ฑ์ค๋ฅผ ํ์ํ์ฌ ๋ฐ์ดํฐ์ ์์น๋ฅผ ์ฐพ๊ณ , ์ดํ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
- ์ด๋ฅผ โ์ธ๋ฑ์ค ๋ฃฉ์
(Index Lookup)โ์ด๋ผ๊ณ ํฉ๋๋ค.
-
2. Covering Index ์ฌ์ฉ:
- ์ฟผ๋ฆฌ๊ฐ ์์ฒญํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ธ๋ฑ์ค์ ํฌํจ๋์ด ์์ผ๋ฉด, ์ธ๋ฑ์ค๋ง์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
- ํ
์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋์คํฌ I/O๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํฉ๋๋ค.
โ
2๏ธโฃ Covering Index์ ์กฐ๊ฑด.
- ์ฟผ๋ฆฌ์ SELECT์ ์ ํฌํจ๋ ์ปฌ๋ผ๊ณผ WHERE, ORDER BY ๋๋ GROUP BY์ ์ฌ์ฉ๋ ์ปฌ๋ผ์ด ๋ชจ๋ ์ธ๋ฑ์ค์ ํฌํจ๋์ด ์์ด์ผ ํฉ๋๋ค.
- ์ด๋ฌํ ์ธ๋ฑ์ค๋ฅผ โCovering Indexโ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
โ
3๏ธโฃ Covering Index์ ์์ .
1๏ธโฃ ํ
์ด๋ธ ์์ฑ ๋ฐ ๋ฐ์ดํฐ ์ฝ์
CREATE TABLE article (
article_id INT NOT NULL,
board_id INT NOT NULL,
created_at DATETIME NOT NULL,
title VARCHAR(255),
content TEXT,
PRIMARY KEY (article_id)
);
2๏ธโฃ ์ธ๋ฑ์ค ์์ฑ.
CREATE INDEX idx_board_created_at ON article (board_id, created_at);
3๏ธโฃ Covering Index ํ์ฉ ์ฟผ๋ฆฌ.
EXPLAIN
SELECT board_id, created_at
FROM article
WHERE board_id = 1
ORDER BY created_at DESC;
-
์ธ๋ฑ์ค ๋์ ์ค๋ช
:
- ์ฟผ๋ฆฌ์์ ์์ฒญํ ์ปฌ๋ผ(board_id, created_at)์ด ์ธ๋ฑ์ค idx_board_created_at์ ๋ชจ๋ ํฌํจ๋์ด ์์ผ๋ฏ๋ก:
-
Covering Index๊ฐ ์ ์ฉ๋ฉ๋๋ค.
- MySQL์ ํ
์ด๋ธ์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์ง ์๊ณ ์ธ๋ฑ์ค๋ง์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
โ
4๏ธโฃ Covering Index์ ์ฅ์ .
-
1. ์ฑ๋ฅ ํฅ์:
- ์ฟผ๋ฆฌ๊ฐ ์์ฒญํ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ธ๋ฑ์ค์ ์ดํจ๋์ด ์์ผ๋ฏ๋ก ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ง ์์๋ ๋ฉ๋๋ค.
- ๋์คํฌ I/O๊ฐ ์ค์ด๋ค๊ณ , ์ฟผ๋ฆฌ ์คํ ์๊ฐ์ด ํฌ๊ฒ ๋จ์ถ๋ฉ๋๋ค.
-
2. ํจ์จ์ ์ธ ์คํ ๋ฆฌ์ง ํ์ฉ:
- ํ
์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ง ์๊ณ , ์ธ๋ฑ์ค๋ง์ผ๋ก ์ฒ๋ฆฌ๋๋ฏ๋ก ๋ ์ ์ ์์์ ์ฌ์ฉํฉ๋๋ค.
-
3. ํน์ ์ฟผ๋ฆฌ์ ์ต์ ํ ๊ฐ๋ฅ:
- ํน์ ์ฟผ๋ฆฌ์์ ์์ฃผ ์ฌ์ฉํ๋ ์ปฌ๋ผ๋ง ํฌํจํ์ฌ ์ค๊ณํ๋ฉด, ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
โ
5๏ธโฃ Covering Index์ ํ๊ณ.
-
1. ์ธ๋ฑ์ค ํฌ๊ธฐ ์ฆ๊ฐ:
- ์ธ๋ฑ์ค์ ๋ง์ ์ปฌ๋ผ์ ์ถ๊ฐํ๋ฉด, ์ธ๋ฑ์ค ํฌ๊ธฐ๊ฐ ์ปค์ ธ ์ฝ์
/์ญ์ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
-
2. ๋ชจ๋ ์ฟผ๋ฆฌ์ ์ ์ฉ ๋ถ๊ฐ๋ฅ:
-
SELECT *
์ฒ๋ผ ํ
์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ์ ์์ฒญํ๋ ์ฟผ๋ฆฌ์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
- ์ฟผ๋ฆฌ์ ํฌํจ๋์ง ์์ ์ปฌ๋ผ์ ์ฌ์ ํ ์ผ์ด๋ธ์์ ์กฐํํด์ผ ํฉ๋๋ค.
-
3. ๋ณต์กํ ์ค๊ณ ํ์:
- ํน์ ์ฟผ๋ฆฌ์ ๋ง์ถ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ฅผ ์ค๊ณํ๋ ค๋ฉด ์ฟผ๋ฆฌ ๋ถ์์ด ํ์ํ๋ฉฐ, ์ธ๋ฑ์ค ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
โ
6๏ธโฃ Covering Index๊ฐ ์ ํฉํ ๊ฒฝ์ฐ.
-
1. ์ฝ๊ธฐ(SELECT) ์์
์ด ๋ง์ ๊ฒฝ์ฐ:
- ์ฝ๊ธฐ ์ฑ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ ์ฉํฉ๋๋ค.
-
2. ์์ฃผ ์ฌ์ฉ๋๋ ํน์ ์ฟผ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ:
- ์ฟผ๋ฆฌ ํจํด์ ๋ถ์ํ์ฌ, ํ์ํ ์ปฌ๋ผ๋ง ํฌํจํ๋ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ฅผ ์ค๊ณํฉ๋๋ค.
-
3. ๋ฒ์ ๊ฒ์๊ณผ ์ ๋ ฌ์ด ์ค์ํ ๊ฒฝ์ฐ:
- ์: ๋ ์ง๋ณ ์ ๋ ฌ, ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํํฐ๋ง๋ ๊ฒฐ๊ณผ ์กฐํ ๋ฑ.
โ
7๏ธโฃ Covering Inde์ EXPLAIN
- EXPLAIN์ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ์์ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
-
EXPLAIN ๊ฒฐ๊ณผ์์ ํ์ธ ๋ฐฉ๋ฒ:
- Extra ์ด(Column)์ Using index๊ฐ ํ์๋๋ฉด Covering Index๊ฐ ์ ์ฉ๋ ๊ฒ์
๋๋ค.
- ์์ :
EXPLAIN
SELECT board_id, created_at
FROM article
WHERE board_id = 1
ORDER BY created_at DESC;
id |
select_type |
table |
type |
key |
key_len |
ref |
rows |
Extra |
1 |
SIMPLE |
article |
index |
idx_board_created_at |
8 |
const |
100 |
Using Index |
-
๊ฒฐ๊ณผ ํด์:
- Extra์ Using index๊ฐ ํ์๋๋ฉด, ์ฟผ๋ฆฌ๊ฐ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์์ ์๋ฏธํฉ๋๋ค.
๐ ์ ๋ฆฌ.
-
Covering Index๋ ์ฟผ๋ฆฌ๊ฐ ์์ฒญํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ธ๋ฑ์ค์ ํฌํจ๋ ๊ฒฝ์ฐ, ํ
์ด๋ธ์ ์กฐํํ์ง ์๊ณ ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ธ๋ฑ์ค์
๋๋ค.
-
์ฅ์ : ๋์คํฌ I/O ๊ฐ์, ์ฟผ๋ฆฌ ์ฑ๋ฅ ํฅ์.
-
๋จ์ : ์ธ๋ฑ์ค ํฌ๊ธฐ ์ฆ๊ฐ, ๋ชจ๋ ์ฟผ๋ฆฌ์ ์ ์ฉ ๋ถ๊ฐ๋ฅ.
- MySQL์์ EXPLAIN์ผ๋ก ์ธ๋ฑ์ค ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ผ๋ฉฐ, Extra์ Using index๊ฐ ํ์๋๋ฉด Covering Index๊ฐ ์ ์ฉ๋ ๊ฒ์
๋๋ค.