Blockmonkey

[DB] Slow Query ๋ณธ๋ฌธ

Web Development/Back-end

[DB] Slow Query

Blockmonkey 2025. 9. 27. 03:05

๐Ÿ’๐Ÿป‍โ™‚๏ธ Outline

  • ์Šฌ๋กœ์šฐ์ฟผ๋ฆฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ณ , ์›์ธ๊ณผ ํ•ด๊ฒฐ๋ฐฉ์•ˆ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ.

๐ŸŽฏ Research Objective

  • [x] ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • [x] ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์›์ธ์„ ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • [x] ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์•ˆ์— ๋Œ€ํ•ด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿง ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ (Slow Query)๋ž€ ?

  • ์‘๋‹ต์†๋„๊ฐ€ ๋А๋ฆฐ SQL ์ฟผ๋ฆฌ
  • DB ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ ๋˜๋Š” ์ „์ฒด ์‘๋‹ต์‹œ๊ฐ„์ด ๊ธฐ์ค€์น˜ ์ด์ƒ์ธ ๊ฒฝ์šฐ ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ๋ผํ•จ.

 

๐Ÿง ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ ์ฃผ์š” ๋ฐœ์ƒ ์›์ธ

  • ์ธ๋ฑ์Šค X || ์ž˜๋ชป๋œ ์ธ๋ฑ์Šค (์ธ๋ฑ์Šค ๋ฌธ์ œ)
  • ๊ณผ๋„ํ•œ JOIN ์‚ฌ์šฉ (JOIN ๋ฌธ์ œ)
  • Row๊ฐ€ ๋งŽ์€ ํ…Œ์ด๋ธ”์—์„œ limit ์—†์ด ์‹คํ–‰ (ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ๋ถ€์žฌ)
  • ํŠธ๋žœ์žญ์…˜ ๋ฝ ๋Œ€๊ธฐ || ์ถฉ๋Œ (ํŠธ๋žœ์žญ์…˜ ๋ฝ ๋ฌธ์ œ)
  • N+1 ๋ฌธ์ œ

 

๐Ÿง ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ ํ•ด๊ฒฐ๋ฐฉ์•ˆ

  • ์ธ๋ฑ์Šค ๋ฌธ์ œ →
    • ์ ์ ˆํ•œ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ๋ฐ ๊ณผ๋„ํ•œ ์ธ๋ฑ์Šค ์‚ฌ์šฉ X
    • Covering Index์˜ ์ ์ ˆํ•œ ํ™œ์šฉ
    • ์ฟผ๋ฆฌํ”Œ๋žœ ์กฐํšŒ๋ฅผ ํ†ตํ•ด ์กฐํšŒํ•ด ์›์ธ ๋ถ„์„ํ•ด๋ณด์ž
  • JOIN ๋ฌธ์ œ →
    • ๊ณผ๋„ํ•œ ํ…Œ์ด๋ธ” JOIN์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ , ๋ฌด์กฐ๊ฑด ํ•œ ์ฟผ๋ฆฌ์—์„œ ๋๋‚ธ๋‹ค๋Š” ์ƒ๊ฐ์„ ๋ฒ„๋ฆฌ์ž.
  • Row๊ฐ€ ๋งŽ์€ ํ…Œ์ด๋ธ” ์ฟผ๋ฆฌ ์‹œ,
    • ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ(LIMIT, OFFSET)๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ๋ฝ (๋น„๊ด€์  ๋ฝ)์˜ ์‚ฌ์šฉ๋ณด๋‹ค๋Š”
    • ๋‚™๊ด€์  ๋ฝ์„ ์‚ฌ์šฉํ•ด, ํŠธ๋žœ์žญ์…˜ ๋ฝ ๋Œ€๊ธฐ๋ฅผ ์ตœ์†Œํ™” ํ•  ๊ฒƒ.
  • N+1 ๋ฌธ์ œ →
    • ์ ์ ˆํ•œ LazyLoading & Fetch Join์˜ ํ™œ์šฉ

 

๐Ÿง ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ์•ˆ

  • ๊ธฐ๋ณธ์ ์œผ๋กœ DBMS๋Š” ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ์— ๋Œ€ํ•˜์—ฌ mysql.slow_log ์— ์ €์žฅํ•จ.
    • SELECT * FROM mysql.slow_log; ์— ๊ธฐ๋ก
    • ๋งŒ์•ฝ, ์—†์„ ์‹œ SHOW VARIABLES LIKE '%slow%'; ๋กœ log_slow_query๊ฐ€ OFF ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๊ณ  ํ™œ์„ฑํ™” ํ•„์š”.
  • Spring Boot AOP ๊ธฐ๋ฐ˜ ๋ชจ๋‹ˆํ„ฐ๋ง
    • p6spy๋ฅผ ๋‹ฌ๋ฉด, 1์ดˆ ์ด์ƒ ๊ฑธ๋ฆฐ ๊ฒฝ์šฐ ํ•„ํ„ฐ๋ง ๋˜์„œ ๋กœ๊ทธ ๋‚จ๊น€
# [GRADLE] P6Spy์šฉ ๋“œ๋ผ์ด๋ฒ„ ์‚ฌ์šฉ
spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver

# [spy.properties] ์•„๋ž˜ ์˜ต์…˜ ์ถ”๊ฐ€
# ์Šฌ๋กœ์šฐ ์ฟผ๋ฆฌ ๋กœ๊น…๋งŒ ๋‚จ๊ธฐ๊ณ  ์‹ถ์„ ๋•Œ (1์ดˆ์ด์ƒ ๋กœ๊ทธ๋งŒ ๋‚จ์Œ)
appender=com.p6spy.engine.spy.appender.Slf4JLogger
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=Execution Time: %(executionTime)ms | SQL: %(sqlSingleLine)
executionThreshold=1000

 

๐Ÿ“ Conclusion

  • ์Šฌ๋กœ์šฐ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก, ์œ„ ํ•ด๊ฒฐ๋ฐฉ์•ˆ์„ ์ค€์ˆ˜ํ•ด์„œ ์ฝ”๋“œ ์งค ๊ฒƒ.
  • ๋งŒ์•ฝ ๋ฐœ์ƒ ์‹œ, ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ์•ˆ์„ ์ฑ„ํƒํ•˜์—ฌ ์ ์šฉํ•˜๊ณ  ํ•ด๊ฒฐํ•  ๊ฒƒ.

 

๐Ÿ“œ References

'Web Development > Back-end' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[DB] B-Tree vs B+Tree  (0) 2025.09.22
[Java] String & String Builder & StringBuffer  (0) 2025.09.11
EKS - ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ด€๋ฆฌ  (1) 2025.07.21
EKS - Context  (0) 2025.07.21
EKS ์‚ฌ์šฉํ•˜๊ธฐ  (3) 2025.07.21