-
mysql์ ์ธ๋ฑ์ค(r-tree,b-tree, ์ ๋ฌธ๊ฒ์, ํจ์๊ธฐ๋ฐ, ๋ฉํฐ๋ฐธ๋ฅ, ํด๋ฌ์คํฐ๋ง, ์ ๋ํฌ)DB 2025. 2. 15. 15:22
๐ MySQL ์ธ๋ฑ์ค ์ข ๋ฅ
MySQL ์ธ๋ฑ์ค์ ๋์คํฌ ์ฝ๊ธฐ ๋ฐฉ์์ ๋๋ค I/O์ ์์ฐจ I/O๋ก ๋๋ฉ๋๋ค.
๋ชจ๋ ์ธ๋ฑ์ค๋ ๋์คํฌ์์ ์๋ฃ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฝ๊ธฐ ์ํด ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์์ต๋๋ค.
์ด๋ฅผ ์ดํดํ๋ ค๋ฉด ๋์คํฌ์ ๋ฌผ๋ฆฌ์ ๊ตฌ์กฐ(HDD vs SSD), ์ธ๋ฑ์ค ์๋ฃ๊ตฌ์กฐ(B+Tree, Hash, Inverted Index)๋ฅผ ์์์ผ ํฉ๋๋ค.
๐ ๏ธ ๋์คํฌ ์ฝ๊ธฐ ๊ธฐ๋ณธ ๊ฐ๋
1๏ธโฃ ๋๋ค I/O (Random I/O)
- ํน์ง: ๋์คํฌ ํค๋๊ฐ ๋ค์ํ ์์น๋ก ์ด๋ํ๋ฉฐ ๋ฐ์ดํฐ ๊ฒ์.
- ๋น์ฉ: ๋์คํฌ **์ํฌ ํ์(Seek Time)**๊ณผ ๋กํ ์ด์ ๋๋ ์ด ๋ฐ์.
- ๋ฐ์ ์:
- B-Tree ํ์: ์ธ๋ฑ์ค ๋ ธ๋๋ฅผ ํ์ํ๋ฉฐ ๋น์์ฐจ์ ์ผ๋ก ๋์คํฌ ์ ๊ทผ.
- ํด์ ์ธ๋ฑ์ค: ํด์ ๋ฒํท์ด ๋ถ์ฐ๋์ด ์์น๊ฐ ๋ถ๊ท์นํ ๋.
2๏ธโฃ ์์ฐจ I/O (Sequential I/O)
- ํน์ง: ๋์คํฌ ํค๋๊ฐ ์ฐ์๋ ๋ธ๋ก์ ์ฝ์ผ๋ฉฐ ๋ฐ์ดํฐ ํ์.
- ๋น์ฉ: ํ ๋ฒ์ ์ํฌ ํ ์ฐ์ ์ฝ๊ธฐ ๊ฐ๋ฅ → ์ฑ๋ฅ ํฅ์.
- ๋ฐ์ ์:
- ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค(Clustered Index): PK๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์์ฐจ์ ์ผ๋ก ์ฝ์ ๋.
- ๋ฒ์ ๊ฒ์: WHERE age BETWEEN 20 AND 30๊ณผ ๊ฐ์ ๋ฒ์ ์ง์.
[CPU I/O ์์ฒญ]
↓
+-----------------+
| OS I/O Scheduler |
+-----------------+
↓
[HDD ์ปจํธ๋กค๋ฌ]
↓
โโโโโโโโโโ
โ HDD ๋ด๋ถ ๊ตฌ์กฐ โ
โโโโโโโโโโโ
โ ํ๋ํฐ(Platter) โ
โ โโโโโโ โ
โ โ ๋ฐ์ดํฐ ๋ธ๋ก โ โ
โ โ(1234๋ฒ ๋ธ๋ก)โ โ
โ โโโโโโ โ
โ โ
โ ํค๋(Head) โ
โ โโ> ํน์ ํธ๋(Track) โ
โโโโโโโโโโโ๐ ๏ธ ๋์ ๋จ๊ณ (๋๋ค I/O ์์)
- CPU ์์ฒญ:
- ์ฌ์ฉ์๊ฐ SELECT * FROM users WHERE id=100์ ์์ฒญ.
- OS ์ฒ๋ฆฌ:
- I/O ์ค์ผ์ค๋ฌ๋ LBA(Logical Block Address) 1234๋ฒ ๋ธ๋ก์ ์ฐพ์.
- HDD ์ปจํธ๋กค๋ฌ:
- LBA๋ฅผ ๋ฌผ๋ฆฌ์ ์์น๋ก ๋ณํ(ํธ๋ 5, ์นํฐ 3).
- ํค๋ ์ด๋(Seek Time):
- **์ก์ถ์์ดํฐ(Actuator)**๊ฐ ํค๋๋ฅผ ํธ๋ 5๋ก ์ด๋(๋๋ค I/O).
- ๋ฐ์ดํฐ ์ฝ๊ธฐ:
- ํค๋๊ฐ ํ๋ํฐ์ ์๊ธฐ์ฅ ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ๋ฐ์ดํฐ ์ฝ๊ธฐ.
๐ HDD ๋์คํฌ I/O ํต์ฌ
๐ ๊ตฌ๋ถ ๐ HDD I/O ๋ฐ์ ํ๋ํฐ ํ์ ๋ฐ ํค๋ ์ด๋ ํ์ ๋๋ค I/O ๋น์ฉ ๋์(Seek Time ๋ฐ์) ์์ฐจ I/O ์ฑ๋ฅ ์ฐ์ํ์ง๋ง ๋๋ค I/O๋ ๋งค์ฐ ๋๋ฆผ ๋ด๋ถ ๊ตฌ์กฐ ํ๋ํฐ+ํค๋+๋ชจํฐ ๋ฐ์ดํฐ ์ ์ฅ ์๋ฆฌ ์๊ธฐ์ฅ ๋ณํ๋ก ๋ฐ์ดํฐ ๊ธฐ๋ก โ๏ธ ๋์คํฌ ์ ๊ทผ ๊ณผ์ : B+Tree ์ธ๋ฑ์ค๋ฅผ ์ค์ฌ์ผ๋ก
B+Tree ์ธ๋ฑ์ค๋ MySQL InnoDB์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ตฌ์กฐ๋ก, ๋ฐ์ดํฐ์ ๋น ๋ฅธ ๊ฒ์๊ณผ ์์ฐจ ์ ๊ทผ์ ๋ชจ๋ ์ง์ํฉ๋๋ค.
๐งฑ ๊ตฌ์กฐ ๊ฐ์
- ๋ฃจํธ ๋ ธ๋ → ๋ธ๋์น ๋ ธ๋ → ๋ฆฌํ ๋ ธ๋(๋ฐ์ดํฐ ์์น ์ ๋ณด).
- ๋ฆฌํ ๋ ธ๋: ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค์ ๊ฒฝ์ฐ ์ค์ ๋ฐ์ดํฐ ์ ์ฅ, ๋นํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๋ ํฌ์ธํฐ๋ง ์ ์ฅ.
๐ ๋์คํฌ ์ฝ๊ธฐ ํ๋ฆ (์: SELECT * FROM users WHERE age = 25)
1๏ธโฃ ๋ฃจํธ ๋ ธ๋ ํ์ (๋๋ค I/O)
- DB๋ **ํ์ด์ง ๋จ์(๊ธฐ๋ณธ 16KB)**๋ก ๋์คํฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์.
- ๋ฃจํธ ๋ ธ๋๋ ๋์คํฌ์ ํน์ ์์น์ ์กด์ฌ → ๋๋ค I/O ๋ฐ์.
- ๋ฉ๋ชจ๋ฆฌ์ ์์ผ๋ฉด ๋์คํฌ ์ํฌ → ํ์ด์ง ๋ก๋(OS Page Cache ๋๋ InnoDB Buffer Pool).
- ๋ฃจํธ์์ ์ ์ ํ ๋ธ๋์น ๋ ธ๋๋ฅผ ์ฐพ์ ํ์๋ก ์ด๋ → ๋๋ค I/O ๋ฐ๋ณต.
- ๋ฆฌํ ๋ ธ๋์์ ์ฐ์๋ ํ์ด์ง๋ฅผ ์ฝ์ผ๋ฉฐ ์์ฐจ I/O ๋ฐ์.
- ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค์ ๊ฒฝ์ฐ ์ค์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ด ๋์คํฌ ์ถ๊ฐ ์ ๊ทผ ์ต์ํ.
๐ณ B-Tree ์ธ๋ฑ์ค (Balanced Tree)
- ๊ตฌ์กฐ: B-Tree๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ท ํ ํธ๋ฆฌ ๊ตฌ์กฐ.
- ์ฌ์ฉ ๋์: ์ผ๋ฐ์ ์ธ WHERE ์กฐ๊ฑด, ORDER BY, GROUP BY, BETWEEN, =, <, <=, >, >= ๋ฑ.
- ์๋ ์๋ฆฌ: ๋ฃจํธ ๋ ธ๋ → ์ค๊ฐ ๋ ธ๋ → ๋ฆฌํ ๋ ธ๋(๋ฐ์ดํฐ)๋ก ํ์.
- ์ ์ฝ: ๋ฌธ์์ด์ ์ผ์ชฝ๋ถํฐ ์ผ์นํด์ผ ์ธ๋ฑ์ค๋ฅผ ํ์ฉ.
- ํ์ฉ ์:
CREATE INDEX idx_name ON users(name);
SELECT * FROM users WHERE name = 'Alice';๐ฒ R-Tree ์ธ๋ฑ์ค (Spatial Index)
- ๊ตฌ์กฐ: ๊ณต๊ฐ ๋ฐ์ดํฐ(GIS)์ฉ์ผ๋ก ์ค๊ณ๋ ๋ค์ฐจ์ ์ธ๋ฑ์ค.
- ์ฌ์ฉ ๋์: GEOMETRY, POINT, POLYGON ๋ฑ ๊ณต๊ฐ ๋ฐ์ดํฐ.
- ์๋ ์๋ฆฌ: ๊ณต๊ฐ ๊ฐ์ฒด๋ฅผ ์ต์ ๊ฒฝ๊ณ ์ฌ๊ฐํ(MBR)์ผ๋ก ๊ฐ์ธ์ ์ธ๋ฑ์ฑ.
- ์ ์ฝ: MyISAM ์์ง์์๋ง ์ง์(๊ธฐ๋ณธ InnoDB๋ ์ง์ X).
- ํ์ฉ ์:
CREATE SPATIAL INDEX idx_location ON locations (geo_point);
SELECT * FROM locations WHERE ST_Contains(geo_area, POINT(10, 20));๐ FULLTEXT ์ธ๋ฑ์ค (์ ๋ฌธ ๊ฒ์ ์ธ๋ฑ์ค)
- ๊ตฌ์กฐ: ์ญ์์ธ(Inverted Index) ๊ธฐ๋ฐ.
- ์ฌ์ฉ ๋์: ๊ธด ํ ์คํธ ํ๋(CHAR, VARCHAR, TEXT).
- ์๋ ์๋ฆฌ: ๋จ์ด๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ณ ํ ํฐ์ผ๋ก ์ ์ฅ ํ ๊ฒ์.
- ์ ์ฝ: MATCH() AGAINST() ๊ตฌ๋ฌธ ์ฌ์ฉ ํ์.
- ํ์ฉ ์
CREATE FULLTEXT INDEX idx_description ON articles (content);
SELECT * FROM articles WHERE MATCH(content) AGAINST('MySQL Index');๐ ๏ธ ์๋ฃ๊ตฌ์กฐ: ์ญ์์ธ(Inverted Index)
์ญ์์ธ์ ์ ํต์ ์ธ B-Tree์ ๋ฌ๋ฆฌ ๋จ์ด → ๋ฌธ์๋ก์ ๋งคํ์ ๊ด๋ฆฌํฉ๋๋ค.
โ๏ธ ๊ตฌ์กฐ ๋ฐ ๋์ ์๋ฆฌ
- ํ ํฐํ(Tokenization): ๋ฌธ์ฅ์ ๋จ์ด ๋จ์๋ก ๋ถ๋ฆฌ.
- ์ญ์์ธ ์์ฑ: ๊ฐ ๋จ์ด๋ฅผ ํค๋ก, ํด๋น ๋จ์ด๊ฐ ๋ํ๋๋ ํ(Row) ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ผ๋ก ์ ์ฅ.
- ๊ฒ์: MATCH() AGAINST() ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ํ ํฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์.
๐ง ์๋ฃ๊ตฌ์กฐ ๋ด๋ถ ๋์
- ํด์ ๋งต(Hash Map) ๋๋ B-Tree ๊ตฌ์กฐ ์ฌ์ฉ(์์ง์ ๋ฐ๋ผ ๋ค๋ฆ).
- InnoDB๋ ๋ด๋ถ์ ์ผ๋ก B+Tree๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, MyISAM์ ํจ์จ์ ์ธ ์์ถ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉ.
๐ง ํจ์ ๊ธฐ๋ฐ ์ธ๋ฑ์ค (Functional Index) (MySQL 8.0 ์ด์)
- ๊ตฌ์กฐ: ํน์ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ฑ์ค๋ก ์์ฑ.
- ์ฌ์ฉ ๋์: ์ปฌ๋ผ์ด ํจ์ ์ฐ์ฐ์ ์์ฃผ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ.
- ์๋ ์๋ฆฌ: ํจ์ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ฑ์ฑํ์ฌ ํจ์ ํธ์ถ ์ ์ฑ๋ฅ ๊ฐ์ .
- ํ์ฉ ์
CREATE INDEX idx_lower_name ON users((LOWER(name)));
SELECT * FROM users WHERE LOWER(name) = 'alice';๐ ๏ธ ์๋ฃ๊ตฌ์กฐ: B+Tree
- MySQL์ ํจ์ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ฑ์ค์ ์ ์ฅํ ๋๋ B+Tree๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ธ๋ฑ์ค ์์ฑ ์ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ํจ์ ์ฐ์ฐ ๋น์ฉ์ ์ค์ ๋๋ค.
โ๏ธ ๋์ ์๋ฆฌ
- ์ธ๋ฑ์ค ์์ฑ ์ ํจ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ ๋ ธ๋์ ์ ์ฅ.
- ๊ฒ์ ์ ํจ์ ์ฐ์ฐ ์์ด ์ธ๋ฑ์ค ์กฐํ ์ํ.
๐ข ๋ฉํฐ๋ฐธ๋ฅ ์ธ๋ฑ์ค (Multi-Valued Index) (MySQL 8.0 ์ด์)
- ๊ตฌ์กฐ: ๋ฐฐ์ด ๊ฐ์ JSON ๋ฐ์ดํฐ ์์ ๋ค์ค ๊ฐ์ ๋ํ ์ธ๋ฑ์ค.
- ์ฌ์ฉ ๋์: JSON ์ปฌ๋ผ ์์ ๋ค์ค ๊ฐ์ ๊ฐ๋ณ ์ธ๋ฑ์ค๋ก ๊ด๋ฆฌ.
- ์๋ ์๋ฆฌ: JSON ๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ๋ ๋ฆฝ์ ์ธ ์ธ๋ฑ์ค ํญ๋ชฉ์ผ๋ก ์ ์ฅ.
- ํ์ฉ ์:
CREATE INDEX idx_tags ON posts((JSON_EXTRACT(tags, '$[*]')));
SELECT * FROM posts WHERE JSON_CONTAINS(tags, '["mysql"]');๐ ๏ธ ์๋ฃ๊ตฌ์กฐ: B+Tree
- JSON ๋ฐฐ์ด ๊ฐ์ ๋น์ ํ ๋ฐ์ดํฐ์ ์ธ๋ฑ์ฑ์ ์ํด ๋์ .
- ํ๋์ ํ์ด ์ฌ๋ฌ ๊ฐ์ ์ธ๋ฑ์ค ํค๋ฅผ ๊ฐ์ง ์ ์์.
โ๏ธ ๋์ ์๋ฆฌ
- JSON ๋ฐฐ์ด ๋ด ์์๋ฅผ ๊ฐ๋ณ ์ธ๋ฑ์ค ํค๋ก ์ ์ฅ.
- ๊ฒ์ ์ B+Tree๋ฅผ ํตํด ๊ฐ ๊ฐ ํ์.
๐ ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค (Clustered Index)
- ๊ตฌ์กฐ: ๋ฐ์ดํฐ ์์ฒด๊ฐ ์ธ๋ฑ์ค์ ๋ฆฌํ ๋ ธ๋์ ํฌํจ.
- ์ฌ์ฉ ๋์: InnoDB์ Primary Key.
- ์๋ ์๋ฆฌ: B+Tree์ ๋ฆฌํ ๋ ธ๋๊ฐ ์ค์ ๋ฐ์ดํฐ๋ฅผ ํฌํจ.
- ํน์ง:
- ๊ธฐ๋ณธ ํค๊ฐ ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๋ก ์๋ ์์ฑ(InnoDB).
- ๊ธฐ๋ณธ ํค๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ด๋ธ ์ ๋ ฌ.
CREATE TABLE users (
id INT PRIMARY KEY, -- ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค ์๋ ์์ฑ
name VARCHAR(100)
);โ๏ธ ํด๋ฌ์คํฐ๋ vs ๋ ผํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค
๊ตฌ๋ถ ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค ๋ ผํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ์ ๋ฆฌํ ๋ ธ๋์ ์ค์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฆฌํ ๋ ธ๋์ ํฌ์ธํฐ๋ง ์ ์ฅ ์ ๋ ฌ ๊ธฐ์ค ๊ธฐ๋ณธ ํค(Primary Key)์ ๋ฐ๋ผ ์ ๋ ฌ ๋ณ๋ ์ปฌ๋ผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ๊ฐ์ ์ ํ ํ ์ด๋ธ๋น 1๊ฐ ์ฌ๋ฌ ๊ฐ ์์ฑ ๊ฐ๋ฅ ์ฑ๋ฅ ํน์ฑ ๋ฒ์ ๊ฒ์, PK ์กฐํ ์ ๋น ๋ฆ ํน์ ์ปฌ๋ผ ์กฐ๊ฑด ๊ฒ์ ์ ํจ์จ์ ์ฌ์ฉ ์ InnoDB ํ ์ด๋ธ์ PRIMARY KEY ๋ณด์กฐ ์ธ๋ฑ์ค(Secondary Index) ๐น ํ์ฉ ํฌ์ธํธ:
- ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๋ ๋ฒ์ ์กฐํ์ ์ ๋ฆฌ.
- ๋ ผํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค๋ ํน์ ์ปฌ๋ผ ๊ฒ์ ์ ํจ์จ์ .
- ๋ณตํฉ ์ธ๋ฑ์ค(Composite Index)๋ฅผ ํตํด ๋ค์ค ์ปฌ๋ผ์ ํ์ฉํ ์ ์์.
'DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MySQL ๋ฐ์ดํฐ ์์ถ (0) 2025.02.15 MySQL ์ํคํ ์ฒ ๋ฐ MySQL ์ฟผ๋ฆฌ ์คํ ์๊ณ ๋ฆฌ์ฆ (0) 2025.02.15 MongoDB - Geo Index ์ ๋ํ ์ฐ๊ตฌ (0) 2024.04.21 RDB VS NoSQL 2ํ (3) 2020.08.11 RDB VS NoSQL 1ํ (0) 2020.08.09