๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ ์ตœ์ข…ํ”„๋กœ์ ํŠธ/๐Ÿš€ ๊ธฐ๋Šฅ ๊ฐœ์„ 

[๊ธฐ๋Šฅ ๊ฐœ์„ ] “31s ๊ฑธ๋ฆฌ๋˜ ์ฟผ๋ฆฌ๋ฅผ 146ms๋กœ ์ค„์ธ ์ด์•ผ๊ธฐ”

by carrot0911 2025. 4. 4.

๐Ÿš€ ์—ฐ๋ น๋Œ€๋ณ„ ์ธ๊ธฐ ํ‚ค์›Œ๋“œ, 31s์—์„œ 146ms๊นŒ์ง€! ์„ฑ๋Šฅ ๊ฐœ์„  ์—ฌ์ •

 

๐Ÿ’ญ ๋ฌธ์ œ ์ธ์‹

์„œ๋น„์Šค ๋‚ด์—์„œ ์ œ๊ณตํ•˜๋Š” "์—ฐ๋ น๋Œ€๋ณ„ ์ธ๊ธฐ ํ‚ค์›Œ๋“œ" ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ์ž ํ†ต๊ณ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”์ฒœ ๊ธฐ๋Šฅ๊ณผ ์—ฐ๋™๋˜๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋งˆ๋‹ค ์‘๋‹ต ์†๋„๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋Š๋ฆฌ๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์ด ๋“ค์–ด์˜ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

๐Ÿข ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

 

  • ๋กœ์ปฌ ์กฐํšŒ ์‹œ๊ฐ„ : 31.49์ดˆ
  • ๋ฐฐํฌ ์„œ๋ฒ„ : 504 Gateway Timeout ๋ฐœ์ƒ
  • JMeter ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ : ์—๋Ÿฌ์œจ 90% ์ด์ƒ

๐Ÿ“Œ ํ†ต๊ณ„ ํŽ˜์ด์ง€์กฐ์ฐจ ์—ด๋ฆฌ์ง€ ์•Š๋Š” ์ƒํ™ฉ..์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์‹ค์ƒ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์˜€๋‹ค.

 

๐Ÿ” ํ˜„์žฌ ๊ตฌ์กฐ ๋ถ„์„

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ธฐ์กด ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด
์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๋‹ค๋‹จ๊ณ„ ์ง‘๊ณ„ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์—ˆ๋‹ค.

์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ

 

ํ•ด๋‹น ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
1๏ธโƒฃ ๋‚ด๋ถ€ ์„œ๋ธŒ ์ฟผ๋ฆฌ
     ๐Ÿ‘‰ userKeyword์™€ user ํ…Œ์ด๋ธ” ์กฐ์ธ
     ๐Ÿ‘‰ user.Age๊ฐ€ minAge ~ maxAge ์‚ฌ์ด์ธ ์‚ฌ์šฉ์ž๋งŒ ํ•„ํ„ฐ๋ง
     ๐Ÿ‘‰ ์กฐ๊ฑด์— ๋งž๋Š” userKeyword.id์˜ ๊ฐœ์ˆ˜๋ฅผ count๋กœ ๊ณ„์‚ฐ
     ๐Ÿ‘‰ keywordCount๋ผ๋Š” alias๋กœ ์™ธ๋ถ€ ์ฟผ๋ฆฌ์— ์ „๋‹ฌ

2๏ธโƒฃ ์™ธ๋ถ€ ์ฟผ๋ฆฌ
     ๐Ÿ‘‰ userKeyword → keyword → user ํ…Œ์ด๋ธ”์„ ์กฐ์ธ
      ๐Ÿ‘‰ ๋™์ผํ•œ ์—ฐ๋ น ํ•„ํ„ฐ๋ฅผ ํ•œ๋ฒˆ ๋” ์ˆ˜ํ–‰
      ๐Ÿ‘‰ keyword.id, keyword.name์„ ๊ธฐ์ค€์œผ๋กœ group by ์ˆ˜ํ–‰
      ๐Ÿ‘‰ ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•œ ํ‚ค์›Œ๋“œ ์ˆœ์œผ๋กœ ์ •๋ ฌ (order by count desc)
      ๐Ÿ‘‰ ์ƒ์œ„ 10๊ฐœ๋งŒ ์กฐํšŒ (limit 10)

 

๐Ÿ› ๏ธ ๊ฐœ์„  ์ „๋žต ์ˆ˜๋ฆฝ

๐ŸŽฏ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๊ณ„ํš

1๏ธโƒฃ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋‹จ์ผ ์ฟผ๋ฆฌ๋กœ ์ง‘๊ณ„ ์ตœ์ ํ™”
    ๐Ÿ‘‰ ์ค‘๋ณต๋œ ์กฐ์ธ๊ณผ ํ•„ํ„ฐ๋ง ์ œ๊ฑฐ
    ๐Ÿ‘‰ ์ฟผ๋ฆฌ ์‹คํ–‰ ํšŸ์ˆ˜ ์ตœ์†Œํ™”
    ๐Ÿ‘‰ ์‘๋‹ต ์†๋„ ๊ฐœ์„  ๊ธฐ๋Œ€

2๏ธโƒฃ user.age ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•˜์—ฌ WHERE ์กฐ๊ฑด์˜ ์„ฑ๋Šฅ ๊ฐœ์„ 
     ๐Ÿ‘‰ Full Scan → Index Scan
์ „ํ™˜
     ๐Ÿ‘‰
ํ•„ํ„ฐ๋ง ์†๋„ ํ–ฅ์ƒ ์˜ˆ์ƒ

๊ฐ ์ „๋žต์€ ๋ณ„๋„๋กœ ์‹คํ—˜ํ•˜๋ฉฐ ํšจ๊ณผ๋ฅผ ์ธก์ •ํ–ˆ๊ณ , ์‹ค์ œ ๊ฐœ์„  ์ˆ˜์น˜๋กœ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

โœ… 1๋‹จ๊ณ„: ์„œ๋ธŒ ์ฟผ๋ฆฌ ์ œ๊ฑฐ → ๋‹จ์ผ ์ฟผ๋ฆฌ๋กœ ๋ฆฌํŒฉํ† ๋ง

๊ธฐ์กด ์„œ๋ธŒ ์ฟผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด QueryDSL์˜ NumberTemplate์„ ํ™œ์šฉํ•˜์—ฌ ๋‹จ์ผ ์ฟผ๋ฆฌ ๋‚ด์—์„œ ์ง‘๊ณ„๋ฅผ ๋ฐ”๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํŒฉํ† ๋งํ–ˆ๋‹ค.

๋‹จ์ผ ์ฟผ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•œ ์ฝ”๋“œ

๐Ÿงช ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

ํ•ญ๋ชฉ ๋ณ€๊ฒฝ ์ „ ๋ณ€๊ฒฝ ํ›„
์‹คํ–‰ ์‹œ๊ฐ„ 31.49s 146ms
์—๋Ÿฌ ๋ฐœ์ƒ ๋น„์œจ 90% 0%

๐ŸŽ‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ ์ œ๊ฑฐ๋งŒ์œผ๋กœ๋„ ์‘๋‹ต ์†๋„๋Š” ์•ฝ 215๋ฐฐ ํ–ฅ์ƒ, ์„œ๋ฒ„ ํƒ€์ž„์•„์›ƒ/์—๋Ÿฌ ๋ชจ๋‘ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค!

๋ณต์žกํ•œ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ณด๋‹ค ๋‹จ์ผ ์ฟผ๋ฆฌ์™€ ๋ช…ํ™•ํ•œ Group By๊ฐ€ ํ›จ์”ฌ ํšจ์œจ์ ์ธ ๊ตฌ์กฐ๋ผ๋Š” ๊ฑธ ์ง์ ‘ ์ฒด๊ฐํ–ˆ๋‹ค.

 

โœ… 2๋‹จ๊ณ„: user.age์— ์ธ๋ฑ์Šค ์ ์šฉํ•ด๋ณด๊ธฐ

์„œ๋ธŒ ์ฟผ๋ฆฌ ์ œ๊ฑฐ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์—ˆ์ง€๋งŒ, ์ถ”๊ฐ€์ ์ธ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด user.age ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•ด๋ดค๋‹ค.

CREATE INDEX idx_user_age ON user (age);

๐Ÿ”Ž ์‹คํ–‰ ๊ณ„ํš ์ „ํ›„ ๋น„๊ต ์š”์•ฝ

ํ•ญ๋ชฉ ์ธ๋ฑ์Šค ์ „ ์ธ๋ฑ์Šค ํ›„ ๊ฐœ์„  ๋‚ด์šฉ
user ํ…Œ์ด๋ธ” ์กฐํšŒ ๋ฐฉ์‹ Full table Scan(ALL) Index Range Scan(range) ํ•„ํ„ฐ ์„ฑ๋Šฅ ๊ฐœ์„ 
์‹คํ–‰ ์‹œ๊ฐ„ 62.5ms 52.4ms ์•ฝ 16% ๊ฐœ์„ 
๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ํ‰๊ท  50ms 50ms ๊ฐœ์„  ์ฒด๊ฐ ๋ฏธ๋ฏธ

๐Ÿ“Œ ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•œ ๊ฒฐ๊ณผ, ์‹คํ–‰ ๊ณ„ํš ์ƒ์—์„œ๋Š” ๊ฐœ์„ ์ด ํ™•์ธ๋˜์—ˆ์ง€๋งŒ ๋ถ€ํ•˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ์ฒด๊ฐํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค.

 

๐Ÿค” ๊ทธ๋Ÿฐ๋ฐ... ์ธ๋ฑ์Šค๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ• ๊นŒ?

 

user ํ…Œ์ด๋ธ”์€ ์‚ฌ์šฉ์ž ๊ฐ€์ž… ์‹œ๋งˆ๋‹ค ์ง€์†์ ์œผ๋กœ INSERT ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ age ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด?!
โš ๏ธ ์‚ฝ์ž…/๊ฐฑ์‹ ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ธ๋ฑ์Šค๋ฅผ ์ •๋ ฌ & ์žฌ์ •๋ ฌ
โš ๏ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ธ๋ฑ์Šค ์œ ์ง€ ๋น„์šฉ์ด ์ฆ๊ฐ€
โš ๏ธ ์“ฐ๊ธฐ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ๊ฐ€๋Šฅ์„ฑ๋„ ๋ฐฐ์ œํ•  ์ˆ˜ ์—†๋‹ค.

์ฝ๊ธฐ ์„ฑ๋Šฅ์— ๋น„ํ•ด ์“ฐ๊ธฐ ๋ถ€๋‹ด์ด ์ปค์งˆ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค!
๐Ÿ‘‰ ์ด๋ฏธ ์ฟผ๋ฆฌ ์ตœ์ ํ™”๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ํ™•๋ณดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—,
๐Ÿ‘‰ ์ธ๋ฑ์Šค๋ฅผ ๊ตณ์ด ์œ ์ง€ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

 

 

โœ… ๊ฒฐ๋ก  ๋ฐ ํšŒ๊ณ 

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

๐Ÿ’ก ํ•ต์‹ฌ ์ •๋ฆฌ

โœ… ๋ณต์žกํ•œ ์„œ๋ธŒ ์ฟผ๋ฆฌ → ๋‹จ์ผ ์ฟผ๋ฆฌ๋กœ ๋ฆฌํŒฉํ† ๋ง
๐Ÿ‘‰ ์‹คํ–‰ ์‹œ๊ฐ„ 31.49์ดˆ → 146ms, ์•ฝ 215๋ฐฐ ์†๋„ ๊ฐœ์„ 

โœ… JMeter ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
๐Ÿ‘‰ 100 ์Šค๋ ˆ๋“œ ๊ธฐ์ค€, ์—๋Ÿฌ์œจ 0% ์œ ์ง€

โš–๏ธ ์ธ๋ฑ์Šค ์ ์šฉ์€ ์™œ ์ œ์™ธํ–ˆ์„๊นŒ?

๐Ÿ‘‰ user.age ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉํ•˜์ž ์‹คํ–‰ ๊ณ„ํš ์ƒ ์ผ๋ถ€ ์„ฑ๋Šฅ ๊ฐœ์„  ํšจ๊ณผ๋Š” ์žˆ์—ˆ์ง€๋งŒ ์“ฐ๊ธฐ ์—ฐ์‚ฐ ์‹œ ์ •๋ ฌ/์žฌ์ •๋ ฌ ๋น„์šฉ๊ณผ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ€์— ๋”ฐ๋ฅธ ์œ ์ง€ ๋น„์šฉ์„ ๊ณ ๋ คํ•  ๋•Œ ์žฅ๊ธฐ์ ์œผ๋กœ ์•…์˜ํ–ฅ์„ ์ค„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.