[1] InnoDB ๊ธฐ๋ณธํค์ B-Tree
(1) InnoDB ๊ธฐ๋ณธ ํค์ ์ค์์ฑ
InnoDB ๊ธฐ๋ณธ ํค๋ ์ธ๋ฑ์ค ์ ๋ ฌ ์ ์ฅ ์์ง(Index-Organized Storage Engine) ์ด๋ค. ์ด๋ ๊ธฐ๋ณธ ํค๋ฅผ B-Tree ๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉฐ, ๋ชจ๋ InnoDB ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค๊ฐ ํ์์ด๋ค. ๋ณด์กฐ ์ธ๋ฑ์ค ๋ํ B-Tree ๋ก ๊ตฌ์ฑ๋๋ฉด, ์ฌ๊ธฐ์ ์ ์ฅ๋ ๊ฐ์ ๊ธฐ๋ณธ ํค๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ฒ ๋๋ค.
(2) B-Tree
B-Tree ๋ ๋์คํฌ์ ๊ฐ์ ๋ธ๋ก ๋๋ฐ์ด์ค์์ ํจ์จ์ ์ผ๋ก ๋์ํ๋๋ก ์ค๊ณ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๋ค. ๋์คํฌ์์ ๋จ์ผ ๋ฐ์ดํธ๋ฅผ ์์์ ์์น์์ ์ฝ๋ ๋ฐ ์์ํ๋ ์๊ฐ์ ํฐ ๋ธ๋ก์ ์ฝ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ ์ฅ์ ์ด ์๋ค. ๋ฃจํธ ๋ ธ๋๋ก ๋ถํฐ ์์ํด ๊ฒ์ ํค๋ฅผ ๋น๊ตํด ์ค๊ฐ ๋ ธ๋, ๋ฐ์ดํฐ์ ์กด์ฌํ๋ ๋ฆฌํ ๋ ธ๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. InnoDB ๋ 16KB ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ด๋ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์ฑ๋ฅ์ ์ต์ ํํ๋ค.

[2] Ordered Insert vs Random Insert
(1) ์ ๋ ฌ๋ ์ฝ์ (Ordered Insert)
๊ธฐ๋ณธ ํค๊ฐ ์๋ ์ฆ๊ฐํ๋ ์ ์(AUTO_INCREMENT) ์ผ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋ ์์๋ก ์ฝ์ ๋๋ค.
- ์ด๋ InnoDB ๊ฐ ํ์ด์ง๋ฅผ ์ต๋ํ ์ฑ์ด ์ํ(์ฝ15KB) ๋ก ์ ์งํ๋ฉฐ, ํ์ด์ง ๋ถํ ์ ์ต์ํํ๋ค.
- ์ด๋ฌํ ๋ฐฉ์์ ์ฐ๊ธฐ ์์ ์์ (insert)์ด ๋ง๊ณ , ์ฝ๊ธฐ ์์ (read)์ด ์๋์ ์ผ๋ก ์ ์ ์ํฌ๋ก๋์์ ์ ํฉํ๋ค.
(2) ๋๋ค ์ฝ์ (Random Insert)
๊ธฐ๋ณธ ํค๊ฐ ์์ ๊ฐ์ธ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๊ฐ ๋๋คํ๊ฒ ์ฝ์ ๋๋ฉฐ, ๋๋ค ์ฝ์ ์ ์ฝ๊ธฐ ์์ ์ด ๋ง์ ์ํฌ๋ก๋์์ ์ ํฉํ ์ ์๋ค.
- ํ์ด์ง๊ฐ ์์ฃผ ๋ถํ ๋๊ณ ํ๊ท ์ฑ์ฐ๊ธฐ ๋น์จ์ด ์ฝ 65-75% ๋ก ๊ฐ์ํด ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ๋ค.
- ์ฝ์ ์์ ์์ ์ถ๊ฐ ์ค๋ฒํค๋ ๋ฐ์ํ๋ค.
(3) ์ํฌ๋ก๋ ์ ํ์ ๋ฐ๋ฅธ ๊ธฐ๋ณธ ํค ์ ํ
1. ์ฐ๊ธฐ ์ค์ฌ ์ํฌ๋ก๋(Insert-Heavy Workload)
- ํน์ง : ๋ค๋์ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ธฐ๋กํด์ผ ํ๋ฉฐ, ์ฐ๊ธฐ ์ง์ฐ์ด ํ์ฉ๋์ง ์์
- ๊ถ์ฅ ์ฌํญ : ์๋ ์ฆ๊ฐ ์ ์(AUTO_INCREMENT) ๋ฅผ ์ฌ์ฉํด ์ ๋ ฌ๋ ์ฝ์ ์ ์ ๋
2. ์ผ๊ธฐ ์ค์ฌ ์ํฌ๋ก๋(Read-Heavy Workload)
- ํน์ง : ๋ค์์ ์ฝ๊ธฐ ์์ ์ด ๋๊ท๋ชจ ํ ์ด๋ธ์์ ๋ฐ์ํ๋ฉฐ, Disk I/O ๊ฐ ๋ง์
- ๋ฌธ์ : ์ฟผ๋ฆฌ๋น ์ฌ๋ฌ ํ์ด์ง๋ฅผ ์ฝ์ด์ผ ํ๋ฉฐ, ํจ์จ์ฑ์ด ๋ฎ์.
- ํด๊ฒฐ์ฑ : ๊ธฐ๋ณธ ํค(PK) ๋ฅผ ์ํฌ๋ก๋์ ๋ง๊ฒ ์กฐ์ ํด ๋ฐ์ดํฐ๊ฐ ํ ํ์ด์ง์ ๋ชจ์ด๋๋ก ์ค๊ณํด์ผ ํ๋ค.
[3] PK ๋ณ ๋ฐ์ดํฐ ์ฝ์ ๋ฒค์น๋งํน
PERCONA ์์ ์ ๊ณตํ ๋ฒค์น๋งํน ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด ๋ฐ์ดํฐ ์ฝ์ ์ ์ํ ๋ฐ์ดํฐ ํฌ๊ธฐ์ ์์ ์๊ฐ์ด UUIDv4 ๋ฅผ ์ฌ์ฉํ ๋ ๋นํจ์จ์ ์์ ํ์ธํ ์ ์๋ค. PK ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ, ์์ ์ ๋ ฌ์ ๋ณด์ฅํ๋ UUID ๋๋ AUTO_INCREMENT ์ฌ์ฉ์ ๊ฒํ ํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.

[4] PK ๋ฅผ ์ด๋ป๊ฒ ์ ์ธํ ๊ฒ์ธ๊ฐ??
๋ค์ํ ๊ธฐ์ค์ด ์๊ฒ ์ง๋ง ํด๋น ๋ด์ฉ์ ๋ฆฌ๋ทฐํ๋ฉด์ ์๋์ ๊ฐ์ ๊ธฐ์ค์ ์ธ์ ๋ค.
(1) UUID ver7 ๋ฅผ PK ๋ก ์ ์ธํ๋ ๋ฐฉ๋ฒ
- UUID ver7 ์ time stamp ๋ฅผ ๊ธฐ๋ฐํ ์ ๋ ฌ์ ์ ๊ณตํ๋ UUID ์ด๋ค.
- ์ด๋ ์ ๋ ฌ๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ ๋ณด์ฅํ๋ฉฐ, ์ถ๊ฐ์์ ๋ฐ์ดํฐ ์ฌ์ด์ฆ์ ์ฝ์ ์๋์ ์ด์ ์ด ์๋ค.
(2) PK๋ AUTO_INCREMENT + UUID ver7 ์ ๋ณ๋์ UK ๋ก ์ ์ธํ๋ ๋ฐฉ๋ฒ
- ์ ์ ์ ๊ด๋ จ๋ ์๋ณ์๋ ๋ณด์์ ์ธ ์ ์ฅ์์ ์๋ณ์ ๋ ธ์ถ์ ๊ถ์ฅํ์ง ์๋๋ค.
- ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋์ฒดํค๋ฅผ UUID ver7 ์ ํตํด ๋ ธ์ถ์ํค๊ณ , ์ค์ PK ๋ auto_increment ์ฌ์ฉ์ ๊ฒํ ํด๋ณด์.
- auto_increment ์ฌ์ฉํ๋ ์ด์ ๋ PK์ ๋ฐ์ดํฐ ์ฌ์ด์ฆ ๊ด์ ์์์ ์ ํ์ด๋ค. ๋ค๋ฅธ UUID ver7 ์ ์ ์ธํ๊ณ ๋์ฒดํค๋ฅผ ์ฌ์ฉํด๋ ๊ฒํ ํด๋ณผ ์ฌํญ์ผ ๊ฒ ๊ฐ๋ค.
JPA ๊ธฐ๋ฐ์ผ๋ก uuid ver7 ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋ ๊ธ์ ์ฐธ๊ณ ํด๋ณด์.
Reference
- [PERCONA] Tuning InnoDB Primary Keys : https://www.percona.com/blog/tuning-innodb-primary-keys/
- [PERCONA] Storing UUID Values in MySQL : https://www.percona.com/blog/store-uuid-optimized-way/
'๐ infra > mysql' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Record Lock, Gap Lock, Next Key Lock (0) | 2024.05.20 |
|---|---|
| RDB Table row ์ ๋ฐ์ดํธ ํ๋ ์ํฉ์ ๋ฐฉ์ดํ๊ธฐ ์ํ ๋ฐฉ๋ฒ (0) | 2024.03.06 |
| MySQL - Character Set, Encoding, collation (1) | 2024.03.04 |
