
โ Index ๊ตฌ์กฐ(B+ Tree)

B+Tree
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ผ ์์คํ
๋ฑ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ ์ค ํ๋๋ก ํค์ ์ํด์ ๊ฐ๊ฐ ์๋ณ๋๋ ๋ ์ฝ๋์ ํจ์จ์ ์ธ ์ฝ์
, ๊ฒ์๊ณผ ์ญ์ ๋ฅผ ํตํด ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ํํํ๊ธฐ ์ํ ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ์ ์ผ์ข
์
๋๋ค.
SQLite์ MySQL ์์ฒด๋ B+ Tree๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค์์ ์ฌ์ฉํ๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก
๋ฐ์ดํฐ๋ ๋ฆฌํ ๋
ธ๋(leaf)์๋ง ์ ์ฅํ๊ณ , ๋ด๋ถ ๋
ธ๋๋ ํ์๋ง ๋ด๋นํ๋ ๊ตฌ์กฐ

index๋ inserting, deleting, editing์ ๋ชจ๋ ๋๋ฆฌ๊ฒ ๋ง๋ ๋ค. (๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํ๋ฅผ ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ)
๋ณ๊ฒฝ์ด ์ฆ์ ์ด์ด ์๋ค๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ง ์์ ์๋ ์๋ค.
rowid
SQLite๋ ๊ธฐ๋ณธ ์ ๊ณต, Primary key๋ฅผ ๋ช
์์ ์ผ๋ก ์์ฑํ์ ์, ๊ทธ primary key๋ฅผ rowid๋ก ์ฌ์ฉํ๋ค.
MySQL์ Primary key๊ฐ ์๊ณ , table์ unique column์ด ์์ ์์ ์์ฑํ๋ค.

unique
uniqueํ column์ ์์ฑํ๋ฉด ์๋์ผ๋ก ํด๋น column์ index๊ฐ ๋ง๋ค์ด์ง๋ค.
โ Multi Column Index
Multi-Column Indexes ๋๋ ๋ณตํฉ ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์์ ๋ ๊ฐ ์ด์์ ์ปฌ๋ผ์ ์กฐํฉํ์ฌ ๋ง๋ ์ธ๋ฑ์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ๋์ ์ปฌ๋ผ๋ง์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ Single-Column Index์ ๋ฌ๋ฆฌ, Multi-Column Index๋ ์ฟผ๋ฆฌ ์กฐ๊ฑด์ ์ฌ๋ฌ ์ปฌ๋ผ์ด ํจ๊ป ์ฌ์ฉ๋ ๋ ์ฑ๋ฅ์ ๋์ฑ ์ต์ ํํ ์ ์์ต๋๋ค.
Multi-Column Index์ ํน์ง
1. ์ ๋ ์ปฌ๋ผ ์ฐ์ ๊ท์น: Multi-Column Index๋ ์ ์๋ ์ปฌ๋ผ์ ์์๋๋ก ์ฑ๋ฅ ์ต์ ํ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์๋ฅผ ๋ค์ด, INDEX(col1, col2, col3)๋ผ๋ Multi-Column Index๋ฅผ ์์ฑํ๋ฉด, ์ด ์ธ๋ฑ์ค๋ col1์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ๊ฑฐ๋, col1๊ณผ col2, ๋๋ col1, col2, col3์ ๋ชจ๋ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ ๋๋ง ์ ํจํ๊ฒ ์๋ํฉ๋๋ค. ํ์ง๋ง col2, col3๋ง์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค.
2. ์ฟผ๋ฆฌ ์ต์ ํ: Multi-Column Index๋ ์ฌ๋ฌ ์ปฌ๋ผ์ด ์กฐํฉ๋ ์กฐ๊ฑด์ผ๋ก ์์ฃผ ๊ฒ์๋๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค. ์๋ฅผ ๋ค์ด, WHERE col1 = 'A' AND col2 = 'B'์ ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ๋ง๋ค๋ฉด (col1, col2)๋ก ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
EXPLAIN QUERY PLAN
SELECT
title
FROM
movies
WHERE
revenue > 100
AND rating = 8
AND release_date > 2020;
CREATE INDEX idx ON movies (rating, release_date, revenue);
DROP INDEX idx;
= ์ ๊ฐ์ ์กฐ๊ฑด์ด ์๋๋ผ ๋ฒ์ ์กฐ๊ฑด์ด ์ฌ์ฉ๋๋ฉด ๋ค์ index๋ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ์์ฃผ ์ฌ์ฉํ๊ฑฐ๋ ์ค์ํ index๋ฅผ ๋จผ์ ์์ฑํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
AND๋ก ์ ๋ถ ์ฐ๊ฒฐ๋์ด ์์ง ์๊ณ , ์ค๊ฐ์ OR๊ฐ ์์ผ๋ฉด ๋ค์ค index๊ฐ ๊นจ์ง๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ํด๊ฒฐ๋ฒ์ 2๊ฐ์ง๋ค.
1. ๋ค์ค index๊ฐ ์๋ ๊ฐ๊ฐ index๋ฅผ ์์ฑํด์ค๋ค.
CREATE INDEX idx_rating ON movies(rating);
CREATE INDEX idx_release ON movies(release_date);
2. ๋ค์ค index๋ฅผ ์ฌ์ฉํ๋ฉด์ UNION์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ์ค๋ค.
SELECT * FROM movies WHERE rating = 8
UNION
SELECT * FROM movies WHERE release_date > 2020;


โ Covering Index
Multi Column Index์ฒ๋ผ ๋๋ผ๋งํฑํ์ง ์์ง๋ง ํ๋ฅญํ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ ๊ณตํ๋ค.
Multi Column Index์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ๋ฉด ์ต๊ณ .
Covering Index๋?
query์ ์๊ตฌ์ฌํญ์ ์๋ฒฝํ๊ฒ ๋ง์กฑ์ํค๋ Index
EXPLAIN QUERY PLAN
SELECT
title
FROM
movies
WHERE
rating > 7;
CREATE INDEX idx ON movies (rating, title);
DROP INDEX idx;
์ด์ ๊ฐ์ ๊ฒฝ์ฐ์ query์์ ์ฌ์ฉํ๋ title๊ณผ rating ๋ชจ๋ index์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ index์์ main table๋ก ์ ํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ
๊ณผ๋ํ ์ฌ์ฉ์ ์ ๋ฐ์ดํธ๋ ์ญ์ ์ ์ฑ๋ฅ์ ๋จ์ดํธ๋ฆผ
(index ๋ํ ์ ๋ฐ์ดํธ ํด์ผ ํ๊ธฐ ๋๋ฌธ)
โ Index ์ฌ์ฉ ์๊ธฐ
1. where, order by, join ์ฐ์ฐ ์ ์์ฃผ ์ฌ์ฉํ๋ column์ด ์์ ๋
2. ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ ๋
3. table์ด ํด ๋
4. Foreign keys๊ฐ ์์ ๋
5. ์ผ๋จ index ์์ด ๋ชจ๋ ์์ ์ ๋๋ด๊ณ ๋์, ์ฑ๋ฅ ํฅ์์ด ํ์ํ๋ค๊ณ ๋๊ปด์ก์ ๋
6. ๋ค์ค์ด์ ํจ๊ป ํํฐ๋ง, ์ ๋ ฌํ๋ query์๋ Multi Column Index๋ฅผ ์ฌ์ฉ
7. ์์ฃผ ๋ณ๊ฒฝ๋๋ column์๋ ์ฌ์ฉํ์ง ์๋๋ค
8. ์ํ ์ค๊ฑฐ๋ฆฌ ๊ฐ์ ๊ธด ๊ธ์ column์ด ์๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ธ B+ Tree๋ฅผ ์ฌ์ฉํ์ง๋ง๊ณ full-text index๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
(SQLite๋ ์ง์ ์ ํจ)
'๐งฉ SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| SQL - MySQL, ๋ฌธ๋ฒ (0) | 2026.03.24 |
|---|---|
| SQL - MySQL Data Types (0) | 2026.03.23 |
| SQL - MySQL Setup (0) | 2026.03.23 |
| SQL - SQLite, ๋ฌธ๋ฒ (0) | 2026.03.17 |
| SQL - SQL์ด๋? (0) | 2026.03.17 |