JiwonDev

์ •๋ฆฌ์ค‘ #1 ์—”์ง„ ์•„ํ‚คํ…์ฒ˜

by JiwonDev

๐Ÿ“Œ MySQL ์—”์ง„ ์•„ํ‚คํ…์ฒ˜

MySQL Server๋Š” ๋‹ค๋ฅธ DB์— ๋น„ํ•ด ๊ตฌ์กฐ๊ฐ€ ๋…ํŠนํ•œ ํŽธ์ด๋‹ค. ์ด๋กœ ์ธํ•ด ์ถ”๊ฐ€์ ์ธ ํ˜œํƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ๋‹ค๋ฅธ DB์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

 

MySQL์€ ํฌ๊ฒŒ ๋‚˜๋ˆ„๋ฉด ์•ž๋‹จ์˜ [MySQL ์—”์ง„]๊ณผ [Storage ์—”์ง„]์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์ด [MySQL ์—”์ง„]์—์„œ ์ฒ˜๋ฆฌ๋˜๊ณ , ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ๋งŒ [Storage ์—”์ง„]์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. 

 

@ MySQL ์—”์ง„

์š”์ฒญ๋œ SQL ๋ฌธ์žฅ์„ ๋ถ„์„ํ•˜๊ณ  ์ตœ์ ํ™”ํ•œ๋‹ค.

์ „์ฒ˜๋ฆฌ๊ธฐ, ์˜ตํ‹ฐ๋งˆ์ด์ €, SQL Parser, Connection Handler ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค.

์‹ค์งˆ์ ์ธ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  Group By ๋‚˜ Order By ๊ฐ™์€ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ๋Š” ๋ชจ๋‘ ์—ฌ๊ธฐ์— ์žˆ๋Š” ์ฟผ๋ฆฌ ์‹คํ–‰๊ธฐ์— ์˜ํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค.

๊ทธ๋Ÿผ Storage ์—”์ง„์ด ํ•˜๋Š”๊ฒŒ ๋ญ์—์š”? ๋ผ๊ณ  ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŒŒ์ผ์ฒ˜๋ฆฌ๋Š” ๋‚ด ์ปดํ“จํ„ฐ์— ์žˆ๋Š” C๋“œ๋ผ์ด๋ธŒ์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•˜์ง€ ์•Š๋‹ค. ๋‹จ์ˆœํ•ด๋ณด์ด๋Š” ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๊ณผ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๋ ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋ณต์žกํ•ด์ง€๋Š”๊ฐ€๋ฅผ ๋‚˜์ค‘์— ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

@ Handler API

MySQL ์—”์ง„์˜ ์ฟผ๋ฆฌ ์‹คํ–‰๊ธฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ์ฝ์„ ๋•Œ๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์š”์ฒญํ•ด์•ผํ•œ๋‹ค.

์ด ์š”์ฒญ์— ์‚ฌ์šฉํ•˜๋Š” API๋ฅผ Handler API ๋ผ๊ณ  ํ•œ๋‹ค.

ํ•ด๋‹น API๋ฅผ ํ†ตํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ ˆ์ฝ”๋“œ ์ž‘์—…์ด ์žˆ์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

@ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ (InnoDB, MyISAM)

์—ฌ๋‹ด์œผ๋กœ ๊ธฐ์กด ์‚ฌ์šฉํ•˜๋˜ MyISAM์€ MySQL Indexed Sequential Access Method ์˜ ์•ฝ์–ด์ด๊ณ 

์˜ค๋ผํด์ด 2005๋…„ Innobase ์‚ฌ๋ฅผ ์ธ์ˆ˜ํ•˜์—ฌ InnoDB ๋ผ์ด์„ผ์Šค๋ฅผ ๊ฐ€์ ธ์™”๊ณ , Sun์‚ฌ ์ธ์ˆ˜ ์ดํ›„ MySQL์— ์ ์šฉ์‹œํ‚จ ๊ฒƒ์ด๋‹ค.

์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜, ์ฝ์–ด์˜ค๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

MySQL ์„œ๋ฒ„์—์„œ [MySQL ์—”์ง„]์€ ํ•˜๋‚˜ ๋ฐ–์— ์กด์žฌ ๋ชปํ•˜์ง€๋งŒ, [Storage ์—”์ง„]์€ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ์ด๋ธ”์— ํŠน์ • ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์ง€์ •ํ•ด๋‘๋ฉด, ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ž‘์—…์ด ํŠน์ • ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

mysql> CREATE TABLE test (fd1 INT, fd2 INT) ENGINE=INNODB;

๊ทธ ์™ธ ์—”์ง„ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ค๊ธฐ์œ„ํ•ด ํ‚ค ์บ์‹œ, ๋ฒ„ํผ ํ’€๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋‚ด์žฅํ•˜๊ณ  ์žˆ๋‹ค.

 

 


๐Ÿ“Œ  ํ”Œ๋Ÿฌ๊ทธ์ธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ชจ๋ธ

MySQL์˜ ๋…ํŠนํ•œ ๊ตฌ์กฐ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชจ๋ธ์ด๋‹ค. ์—”์ง„์„ ํ”Œ๋Ÿฌ๊ทธ์ธํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

๋‹ค๋งŒ Storage ์—”์ง„๋งŒ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ํ•„์š”ํ•˜๋‹ค๋ฉด MySQL ์—”์ง„์— ์ „๋ฌธ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ, ๋ณด์•ˆ ์ธ์ฆํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ์„ ํ•„์š”ํ•œ๊ฑธ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ด์™ธ์— ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ „๋ฌธ ๊ฐœ๋ฐœํšŒ์‚ฌ๊ฐ€ ๋งŒ๋“œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ์žˆ์ง€๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ปค์Šคํ…€ํ•˜์—ฌ ๊ฐœ๋ฐœํ• ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ฐธ๊ณ ๋กœ MySQL 8.0 ๋ถ€ํ„ฐ๋Š” ๊ธฐ์กด์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜ ๋Œ€์‹ , ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ง€์›๋œ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พผ ์ด์œ ๋Š”, ์•„๋ž˜์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋‹จ์ ์„ ๊ฐœ์„ ์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์˜ค์ง MySQL ์„œ๋ฒ„์™€ ์ธํ„ฐํŽ˜์ด์Šค ํ•  ์ˆ˜ ์žˆ๊ณ , ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ผ๋ฆฌ๋Š” ํ†ต์‹  ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ MySQL ์„œ๋ฒ„์˜ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•œ๋‹ค. (์ถ”์ƒํ™”, ์บก์Šํ™” ๋˜์ง€์•Š์•„ ์œ„ํ—˜ํ•˜๋‹ค)
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ƒํ˜ธ ์˜์กด ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค. ์ดˆ๊ธฐํ™”๊ฐ€ ์–ด๋ ต๋‹ค.

 


๐Ÿ“Œ MySQL ์Šค๋ ˆ๋”ฉ ๊ตฌ์กฐ

MySQL์€ ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜์ด ์•„๋‹ˆ๋ผ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์— foreground ์™€ background ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋™์ž‘ํ•œ๋‹ค.

@ ํด๋ผ์ด์–ธํŠธ ์Šค๋ ˆ๋“œ (Foreground)

Foreground๋Š” ์„œ๋ฒ„์— ์ ‘์†๋œ ํด๋ผ์ด์–ธํŠธ ์ˆ˜ ๋งŒํผ ์กด์žฌํ•˜๋ฉฐ, ๊ฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฌธ์žฅ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋‹จ ์ž‘์—…์ด ์ข…๋ฃŒ๋˜๋ฉด Thread_Pool๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค. (thread_cache_size) 

 

Foreground ์Šค๋ ˆ๋“œ๋Š” MySQl์˜ ๋ฐ์ดํ„ฐ ๋ฒ„ํผ๋‚˜ ์บ์‹œ๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ค๋ฉฐ, ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ง์ ‘ ๋””์Šคํฌ๋ฅผ ์ฝ๋Š”๋‹ค.

๊ธฐ์กด์˜ MyISAM์€ ๋””์Šคํฌ ์“ฐ๊ธฐ ์ž‘์—…๊นŒ์ง€ ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ InnoDB๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ค์ง ๋ฒ„ํผ์™€ ์บ์‹œ, ๋””์Šคํฌ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฆ‰ ๋ฒ„ํผ์— ๊ธฐ๋ก๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜๋Š”๊ฑด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

@ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ (Background)

MyISAM์€ ํด๋ผ์ด์–ธํŠธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋“ ๊ฑธ ์ฒ˜๋ฆฌํ–ˆ์ง€๋งŒ, InnoDB๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์˜ ์—ญํ• ์ด ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค.

  • ์ธ์„œํŠธ ๋ฒ„ํผ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ์Šค๋ ˆ๋“œ
  • ๋กœ๊ทธ๋ฅผ ๋””์Šคํฌ๋กœ ๊ธฐ๋กํ•˜๋Š” ์Šค๋ ˆ๋“œ
  • InnoDB ๋ฒ„ํผ ํ’€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜๋Š” ์Šค๋ ˆ๋“œ
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ๋กœ ์ฝ์–ด์˜ค๋Š” ์Šค๋ ˆ๋“œ
  • ์ž ๊ธˆ์ด๋‚˜ ๋ฐ๋“œ๋ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์Šค๋ ˆ๋“œ

ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„์ค‘ ์“ฐ๊ธฐ ์ž‘์—…์€ ์ง€์—ฐ(๋ฒ„ํผ๋ง)๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฝ๊ธฐ๋Š” ์ง€์—ฐ ๋  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ผ๋ฐ˜์ ์ธ ์ƒ์šฉ DB๋Š” ๋Œ€๋ถ€๋ถ„ ์“ฐ๊ธฐ ์ž‘์—…์„ ๋ฒ„ํผ๋งํ•ด์„œ ์ผ๊ด„์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด๋Š” InnoDB๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ InnoDB์—์„œ๋Š” Insert, Update, Delete ์ฟผ๋ฆฌ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋””์Šคํฌ์— ์™„์ „ํžˆ ์ €์žฅ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„๋„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

 


๐Ÿ“Œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐ ์‚ฌ์šฉ ๊ตฌ์กฐ

MySQL ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ธ€๋กœ๋ฒŒ๊ณผ ๋กœ์ปฌ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

 

@ ๊ธ€๋กœ๋ฒŒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

๊ธ€๋กœ๋ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋Š” MySQL ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋œ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์Šค๋ ˆ๋“œ ์ˆซ์ž์™€๋Š” ๋ฌด๊ด€ํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ• ๋‹น๋˜๊ณ  ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. 

 

๋‹ค๋งŒ ์ž๋ฐ” static ์˜์—ญ์ฒ˜๋Ÿผ ๋ฌด์กฐ๊ฑด ์ฒ˜์Œ๋ถ€ํ„ฐ 100% ํ• ๋‹น๋˜๋Š”๊ฑด ์•„๋‹ˆ๊ณ , ์šด์˜์ฒด์ œ์˜ ํ• ๋‹น ๋ฐฉ์‹์— ๋”ฐ๋ผ ์˜ˆ์•ฝํ•ด๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ ์กฐ๊ธˆ์”ฉ ํ• ๋‹นํ•ด์ฃผ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

 

@ ๋กœ์ปฌ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

๋กœ์ปฌ๋ฉ”๋ชจ๋ฆฌ๋Š” ์„ธ์…˜, ์ปค๋„ฅ์…˜ ๋ฉ”๋ชจ๋ฆฌ๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

MySQL ์„œ๋ฒ„ ์ƒ์— ํด๋ผ์ด์–ธํŠธ ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์ด๋ฉฐ ์Šค๋ ˆ๋“œ ๋ณ„๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹น๋˜๊ณ  ์ ˆ๋Œ€ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์•„์˜ˆ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์กฐ์ฐจ ํ• ๋‹นํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์ด๋Š” Sort, Join ๋ฒ„ํผ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

 

๋กœ์ปฌ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ๋ฒ„ํผ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

Connection, Result ๋ฒ„ํผ๋Š” ํด๋ผ์ด์–ธํŠธ ์ปค๋„ฅ์…˜์ด ์—ด๋ ค์žˆ๋Š” ๋™์•ˆ ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋‚จ์•„์žˆ์œผ๋‚˜ Sort, Join ๋ฒ„ํผ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ˆœ๊ฐ„์—๋งŒ ํ• ๋‹นํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํ•ด์ œํ•˜๊ฒŒ ๋œ๋‹ค.

 


๐Ÿ“Œ ์ฟผ๋ฆฌ ์‹คํ–‰๊ตฌ์กฐ

@ Qurey Cache (MySQL 8.0์— ์ œ๊ฑฐ๋จ)

์ฟผ๋ฆฌ ์บ์‹œ๋Š” ๋น ๋ฅธ ์‘๋‹ต์„ ํ•„์š”๋กœ ํ•˜๋Š” ์›น ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ๋‹ด๋‹นํ–ˆ๋‹ค.

SQL์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜์—ฌ ๋™์ผํ•œ SQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ํ…Œ์ด๋ธ”์„ ์ฝ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜๋Š” ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ MySQL 8.0์œผ๋กœ ๋„˜์–ด์˜ค๋ฉฐ ์ฟผ๋ฆฌ ์บ์‹œ๋Š” MySQL ์„œ๋ฒ„์˜ ๊ธฐ๋Šฅ์—์„œ ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์ œ๊ฑฐ ๋˜์—ˆ๋‹ค. ์„ฑ๋Šฅ์ด ๋น ๋ฅด๋‹ค๊ณ  ํ•ด๋„ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์บ์‹œ์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์„œ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๋™์‹œ์„ฑ๋Šฅ ์ฒ˜๋ฆฌ์— ์‹ฌ๊ฐํ•œ ์˜ํ–ฅ์„ ์ฃผ์—ˆ๊ณ , ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ์ฟผ๋ฆฌ ์บ์‹œ๊ฐ€ ์„ฑ๋Šฅ์— ํฐ ๋„์›€์ด ๋œ ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฌด์—‡๋ณด๋‹ค ์ˆ˜ ๋งŽ์€ ๋ฒ„๊ทธ์˜ ์›์ธ์œผ๋กœ ์ง€๋ชฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐ๋œ ๊ฒƒ๋„ ์žˆ๋‹ค.

 

@ Query Parser

์ฟผ๋ฆฌ๋ฌธ์„ ํ† ํฐ์œผ๋กœ ๋ถ„๋ฆฌํ•ด ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ํ† ํฐ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…

 

@ PreProcessor

ํŒŒ์„œ ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ œ์ ์„ ํŒŒ์•…ํ•œ๋‹ค. ์ฟผ๋ฆฌ ํŒŒ์„œ๋Š” ํ† ํฐ์˜ ์œ ํšจ์„ฑ๋งŒ ๊ฒ€์‚ฌํ•œ๋‹ค๋ฉด, ๋ฌธ๋ฒ•๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ์ž‘์—…. ์ด ๋‹จ๊ณ„์—์„œ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ๋งคํ•‘ํ•˜๊ณ , ๊ฐ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€, ์ ‘๊ทผ ๊ถŒํ•œ ๋˜ํ•œ ํ•จ๊ป˜ ํ™•์ธํ•œ๋‹ค.

  

@ Query Optimizer

์ „์ฒ˜๋ฆฌ๊นŒ์ง€ ์™„๋ฃŒ๋œ ์œ ํšจํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™” ์‹œ์ผœ Storage Engine์— ๋„˜๊ธธ ์‹ค์ œ ์‹คํ–‰๊ณ„ํš์„ ์ƒ์„ฑํ•ด๋‚ธ๋‹ค.

 

@ Query execution engine (api calls)

์ƒ์„ฑ๋œ ์‹คํ–‰ ๊ณ„ํš์„ ๋ฐ”ํƒ•์œผ๋กœ Storage engine์˜ Handler API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์‹ค์งˆ์ ์ธ API ํ˜ธ์ถœ๊ณผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ณณ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด GROUP BY ๋ผ๋Š” ์‹คํ–‰๊ณ„ํš์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์ด ์ง„ํ–‰๋œ๋‹ค.
1. ์‹คํ–‰ ์—”์ง„์ด Handler API๋กœ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๋ผ๊ณ  ์š”์ฒญ
2. ์‹คํ–‰ ์—”์ง„์€ WHERE ์ ˆ์— ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์˜ค๋ผ๊ณ  Handler API ์š”์ฒญ
3. ์ฝ์–ด์˜จ ๋ ˆ์ฝ”๋“œ๋“ค์„ ์ž„์‹œํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๋ผ๊ณ  Handler API ์š”์ฒญ
4. ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋œ ์ž„์‹œ ํ…Œ์ด๋ธ”์—์„œ ํ•„์š”ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋ผ๊ณ  Handler API ์š”์ฒญ
5. ์ตœ์ข…์ ์œผ๋กœ ์‹คํ–‰ ์—”์ง„์€ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž๋‚˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ๋„˜๊น€

 

@ Storage engines (Handler)

MySQL ์„œ๋ฒ„ ๊ฐ€์žฅ ๋ฐ‘๋‹จ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ณ , ์ฝ์–ด์˜ค๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

์ฆ‰ MyISAM, InnoDB ๊ฐ™์€ Storage Engine์„ Handler๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

 

 

@ Thread Pool

MySQL์˜ ๊ธฐ๋ณธ Thread Pool์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋ฒ„์ „์—๋งŒ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์—์„œ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Percona ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•œ ์Šค๋ ˆ๋“œ ํ’€์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์Šค๋ ˆ๋“œ ํ’€์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์ค„์—ฌ CPU์˜ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜์™€ ์ž์›์˜ ์†Œ๋ชจ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค. ๋‹ค๋งŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ƒฅ ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ์„ฑ๋Šฅ์ด ๋†’์•„์งˆ ๊ฒƒ์ด๋ผ ๊ธฐ๋Œ€ํ•˜๋Š”๋ฐ ์•„๋ฌด์ƒ๊ฐ์—†์ด ์„ค์ •ํ•œ๋‹ค๋ฉด ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ CPU ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ํ™•๋ณด ๋ฐ›์ง€ ๋ชปํ•ด ๋” ๋Š๋ ค์ง€๋Š” ์‚ฌ๋ก€๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์œ ์˜ํ•˜์ž.

 

Percona Server ์Šค๋ ˆ๋“œํ’€์€ ๊ธฐ๋ณธ์ ์œผ๋กœ CPU ์ฝ”์–ด ๊ฐœ์ˆ˜๋งŒํผ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•œ๋‹ค. 

์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์Šค๋ ˆ๋“œ ํ’€์—์„œ๋Š” ์ž‘์—… ์Šค๋ ˆ๋“œ๋ฅผ ์ถ”๊ฐ€ํ• ์ง€, ์•„๋‹ˆ๋ฉด ์Šค๋ ˆ๋“œ ๋ฐ˜ํ™˜์„ ๊ธฐ๋‹ค๋ฆด์ง€ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” thread_pool_stall_limit ๋ณ€์ˆ˜์— ์„ค์ •๋œ ๋ฐ€๋ฆฌ์ดˆ๋งŒํผ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ƒ์„ฑํ•˜๋Š”๋ฐ thread_pool_max_threads ๋ณ€์ˆ˜๋กœ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋˜ํ•œ ํ›„์ˆœ์œ„, ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜์—ฌ SQL์˜ ์ˆœ์„œ๋ฅผ ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ Lock์ด ๋น ๋ฅด๊ฒŒ ํ’€๋ฆฌ๋„๋ก ์กฐ์ •ํ•˜์—ฌ ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

@ ํŠธ๋žœ์žญ์…˜ ์ง€์› ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

MySQL 5.7 ๊นŒ์ง€๋Š” ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ db.frm (format) ํ™•์žฅ์ž ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ , ์ผ๋ถ€ stored program ๋˜ํ•œ ํŒŒ์ผ(.trn .trg .par)๋กœ ๊ด€๋ฆฌ ํ–ˆ์—ˆ๋‹ค. ๋‹จ์ˆœํžˆ ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์ž์ฒด์ ์ธ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ” ์ƒ์„ฑ & ๋ณ€๊ฒฝ ๋„์ค‘ MySQL ์„œ๋ฒ„๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ ์ข…๋ฃŒ๋˜๋ฉด ํŒŒ์ผ ๋‚ด์šฉ์ด ์ผ๊ด€๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ MySQL 8.0 ๋ถ€ํ„ฐ๋Š” ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ ์ •๋ณด, Stored Program๋“ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋“ค์„ InnoDB ์— ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด ๋”ฐ๋กœ ์ €์žฅํ•œ๋‹ค. ์ฆ‰ DB ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ์ž‘์—…์„ ์›์ž์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ MySQL์˜ ์„œ๋ฒ„๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋„๋ก ๋ฐ”๋€Œ์—ˆ๋‹ค.

 

'๐ŸŒฑBackend > DB(MySQL,PostgreSQL)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ •๋ฆฌ์ค‘-5  (0) 2021.10.27
์ •๋ฆฌ์ค‘ - 4  (0) 2021.10.20
์ •๋ฆฌ์ค‘ - 3  (0) 2021.10.20
์ •๋ฆฌ์ค‘ -2  (0) 2021.10.20
1. MySQL์€ ๋ฌด์—‡์ธ๊ฐ€  (0) 2021.10.13

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ