PK ์„ ์–ธ ํƒ€์ž…์— ๊ด€ํ•œ ๊ธฐ์ค€ - Ordered Insert vs Random Insert

2025. 1. 16. 13:55ยท๐Ÿ“‚ infra/mysql

[1] InnoDB ๊ธฐ๋ณธํ‚ค์™€ B-Tree

(1) InnoDB ๊ธฐ๋ณธ ํ‚ค์˜ ์ค‘์š”์„ฑ

InnoDB ๊ธฐ๋ณธ ํ‚ค๋Š” ์ธ๋ฑ์Šค ์ •๋ ฌ ์ €์žฅ ์—”์ง„(Index-Organized Storage Engine) ์ด๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ ํ‚ค๋ฅผ B-Tree ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ๋ชจ๋“  InnoDB ํ…Œ์ด๋ธ”์— ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ํ•„์ˆ˜์ด๋‹ค. ๋ณด์กฐ ์ธ๋ฑ์Šค ๋˜ํ•œ B-Tree ๋กœ ๊ตฌ์„ฑ๋˜๋ฉด, ์—ฌ๊ธฐ์„œ ์ €์žฅ๋œ ๊ฐ’์€ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ฒŒ ๋œ๋‹ค.

 

(2) B-Tree

B-Tree ๋Š” ๋””์Šคํฌ์™€ ๊ฐ™์€ ๋ธ”๋ก ๋””๋ฐ”์ด์Šค์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค. ๋””์Šคํฌ์—์„œ ๋‹จ์ผ ๋ฐ”์ดํŠธ๋ฅผ ์ž„์˜์˜ ์œ„์น˜์—์„œ ์ฝ๋Š” ๋ฐ ์†Œ์š”ํ•˜๋Š” ์‹œ๊ฐ„์€ ํฐ ๋ธ”๋ก์„ ์ฝ๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๊ฒ€์ƒ‰ ํ‚ค๋ฅผ ๋น„๊ตํ•ด ์ค‘๊ฐ„ ๋…ธ๋“œ, ๋ฐ์ดํ„ฐ์— ์กด์žฌํ•˜๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. InnoDB ๋Š” 16KB ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ด๋Š” ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•œ๋‹ค.

ref : https://utsman.github.io/mysql/2017/07/26/mysql-index/

 

 

[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 ์‚ฌ์šฉ์„ ๊ฒ€ํ† ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

ref : https://www.percona.com/blog/store-uuid-optimized-way/

 

 

[4] PK ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ ์–ธํ•  ๊ฒƒ์ธ๊ฐ€??

๋‹ค์–‘ํ•œ ๊ธฐ์ค€์ด ์žˆ๊ฒ ์ง€๋งŒ ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ฆฌ๋ทฐํ•˜๋ฉด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ์ค€์„ ์„ธ์› ๋‹ค.

(1) UUID ver7 ๋ฅผ PK ๋กœ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. UUID ver7 ์€ time stamp ๋ฅผ ๊ธฐ๋ฐ˜ํ•œ ์ •๋ ฌ์„ ์ œ๊ณตํ•˜๋Š” UUID ์ด๋‹ค.
  2. ์ด๋Š” ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ๋ณด์žฅํ•˜๋ฉฐ, ์ถ”๊ฐ€์‹œ์˜ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์ฆˆ์™€ ์‚ฝ์ž… ์†๋„์— ์ด์ ์ด ์žˆ๋‹ค.

(2) PK๋Š” AUTO_INCREMENT + UUID ver7 ์„ ๋ณ„๋„์˜ UK ๋กœ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. ์œ ์ €์— ๊ด€๋ จ๋œ ์‹๋ณ„์ž๋Š” ๋ณด์•ˆ์ ์ธ ์ž…์žฅ์—์„œ ์‹๋ณ„์ž ๋…ธ์ถœ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€์ฒดํ‚ค๋ฅผ UUID ver7 ์„ ํ†ตํ•ด ๋…ธ์ถœ์‹œํ‚ค๊ณ , ์‹ค์ œ PK ๋Š” auto_increment ์‚ฌ์šฉ์„ ๊ฒ€ํ† ํ•ด๋ณด์ž.
  3. auto_increment ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” PK์˜ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์ฆˆ ๊ด€์ ์—์„œ์˜ ์„ ํƒ์ด๋‹ค. ๋‹ค๋ฅธ UUID ver7 ์„ ์„ ์–ธํ•˜๊ณ  ๋Œ€์ฒดํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ฒ€ํ† ํ•ด๋ณผ ์‚ฌํ•ญ์ผ ๊ฒƒ ๊ฐ™๋‹ค.

 

JPA ๊ธฐ๋ฐ˜์œผ๋กœ uuid ver7 ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ๊ธ€์„ ์ฐธ๊ณ ํ•ด๋ณด์ž.

  • [dev-cooper] JPA์— UUID version7 ์ ์šฉํ•˜๊ธฐ

 

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
'๐Ÿ“‚ infra/mysql' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Record Lock, Gap Lock, Next Key Lock
  • RDB Table row ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
  • MySQL - Character Set, Encoding, collation
cooper25
cooper25
  • cooper25
    dev cooper
    cooper25
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (84)
      • ๐Ÿ“‚ backend (34)
        • spring (19)
        • architecture (10)
        • test (5)
      • ๐Ÿ“‚ computer-science (5)
      • ๐Ÿ“‚ programming-language (12)
        • java (12)
      • ๐Ÿ“‚ infra (9)
        • mysql (4)
        • redis (2)
        • message-queue (3)
      • ๐Ÿ“‚ cloud (2)
        • aws (2)
      • ๐Ÿ“‚ frontend (1)
        • react (0)
      • ๐Ÿ“‚ education & lecture (16)
        • ์ธํ”„๋ผ ๊ณต๋ฐฉ (11)
        • ํ•ญํ”Œ ๋ฐฑ์—”๋“œ 7๊ธฐ (5)
      • ๐Ÿ“‚ ai (1)
        • claude (1)
      • ๐Ÿ“‚ etc (2)
        • ํšŒ๊ณ  (1)
        • ์ปจํผ๋Ÿฐ์Šค (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    spring-batch
    UUID
    ์Šคํ”„๋ง์บ ํ”„ ํ›„๊ธฐ
    JPA
    AWS
    ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„
    kafka
    Redisson
    spring AOP
    mysql
    ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์„ค๊ณ„
    ํ•ญํ•ดํ”Œ๋Ÿฌ์Šค
    react
    ์ธํ”„๋ผ๊ณต๋ฐฉ
    spring
    gof
    spring camp 2025
    ๋™์‹œ์„ฑ
    ํšŒ๊ณ 
    nGrinder
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
cooper25
PK ์„ ์–ธ ํƒ€์ž…์— ๊ด€ํ•œ ๊ธฐ์ค€ - Ordered Insert vs Random Insert
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”