Skip to content

Latest commit

Β 

History

History
37 lines (20 loc) Β· 4.32 KB

query_optimization_08.md

File metadata and controls

37 lines (20 loc) Β· 4.32 KB

쿼리 μž‘μ„± 및 μ΅œμ ν™”

쿼리 μ„±λŠ₯ ν…ŒμŠ€νŠΈ

쿼리 μ„±λŠ₯에 영ν–₯을 λ―ΈμΉ˜λŠ” μš”μ†Œ

운영체제의 μΊμ‹œ

MySQL μ„œλ²„λŠ” OS의 파일 μ‹œμŠ€ν…œ μ½œμ„ μ΄μš©ν•΄ 데이터 νŒŒμΌμ„ μ½μ–΄μ˜¨λ‹€. 그런데 일반적으둜 λŒ€λΆ€λΆ„μ˜ OSλŠ” ν•œ 번 읽은 λ°μ΄ν„°λŠ” OSκ°€ κ΄€λ¦¬ν•˜λŠ” λ³„λ„μ˜ μΊμ‹œ μ˜μ—­μ— 보관해뒀닀가 λ‹€μ‹œ ν•΄λ‹Ή 데이터가 μš”μ²­λ˜λ©΄ λ””μŠ€ν¬λ₯Ό 읽지 μ•Šκ³  μΊμ‹œμ˜ λ‚΄μš©μ„ λ°”λ‘œ MySQL μ„œλ²„λ‘œ λ°˜ν™˜ν•œλ‹€.

InnoDB μŠ€ν† λ¦¬μ§€ 엔진은 일반적으둜 파일 μ‹œμŠ€ν…œμ˜ μΊμ‹œλ‚˜ 버퍼λ₯Ό κ±°μΉ˜μ§€ μ•ŠλŠ” Direct I/Oλ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ OS의 μΊμ‹œκ°€ 그닀지 큰 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šμ§€λ§Œ MyISAM의 경우 OS μΊμ‹œμ— λŒ€ν•œ μ˜μ‘΄λ„κ°€ λ†’μ•„μ„œ OS μΊμ‹œμ— 따라 μ„±λŠ₯ 차이가 큰 νŽΈμ΄λ‹€.

MySQL μ„œλ²„μ˜ 버퍼 ν’€(InnoDB 버퍼 ν’€, MyISAM ν‚€ μΊμ‹œ)

OS λ²„νΌλ‚˜ μΊμ‹œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ MySQL μ„œλ²„μ—μ„œλ„ 데이터 파일 λ‚΄μš©μ„ νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ μΊμ‹œν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ”λ°, InnoDB μŠ€ν† λ¦¬μ§€ 엔진이 κ΄€λ¦¬ν•˜λŠ” μΊμ‹œλ₯Ό 버퍼 풀이라고 ν•˜λ©° MyISAM μŠ€ν† λ¦¬μ§€ 엔진이 κ΄€λ¦¬ν•˜λŠ” μΊμ‹œλŠ” ν‚€ μΊμ‹œλΌκ³  ν•œλ‹€.

InnoDB 버퍼 풀은 인덱슀 νŽ˜μ΄μ§€λŠ” λ¬Όλ‘  데이터 νŽ˜μ΄μ§€κΉŒμ§€ μΊμ‹œν•˜λ©°, μ“°κΈ° μž‘μ—…μ„ μœ„ν•œ 버퍼링 μž‘μ—…κΉŒμ§€ ν•¨κ»˜ μ²˜λ¦¬ν•œλ‹€. 그와 달리 MyISAM의 ν‚€ μΊμ‹œλŠ” 주둜 읽기λ₯Ό μœ„ν•œ μΊμ‹œ 역할을 μˆ˜ν–‰ν•˜λ©°, μ œν•œμ μœΌλ‘œ 인덱슀 λ³€κ²½λ§Œμ„ μœ„ν•œ 버퍼 역할을 μˆ˜ν–‰ν•œλ‹€. λ”°λΌμ„œ MyISAM μŠ€ν† λ¦¬μ§€ μ—”μ§„μ—μ„œλŠ” 인덱슀λ₯Ό μ œμ™Έν•œ ν…Œμ΄λΈ” λ°μ΄ν„°λŠ” λͺ¨λ‘ OS μΊμ‹œμ— μ˜μ‘΄ν•  수 밖에 μ—†λ‹€.

MySQL μ„œλ²„κ°€ ν•œλ²ˆ μ‹œμž‘λ˜λ©΄ InnoDB 버퍼 ν’€κ³Ό MyISAM ν‚€ μΊμ‹œμ˜ λ‚΄μš©μ„ κ°•μ œλ‘œ 퍼지할 수 μžˆλŠ” 방법이 μ—†λ‹€. μ΄ˆκΈ°ν™”ν•˜λ €λ©΄ MySQL μ„œλ²„λ₯Ό μž¬μ‹œμž‘ν•΄μ•Ό ν•œλ‹€. 특히 InnoDB 버퍼 풀은 MySQL μ„œλ²„κ°€ μ’…λ£Œλ  λ•Œ μžλ™μœΌλ‘œ 덀프됐닀가 λ‹€μ‹œ μ‹œμž‘ν•  λ•Œ μžλ™μœΌλ‘œ μ μž¬λœλ‹€. κ·Έλž˜μ„œ InnoDB 버퍼 풀이 μžλ™μœΌλ‘œ λ€ν”„λ˜κ³  μ μž¬λ˜μ§€ μ•Šκ²Œ innodb_buffer_pool_load_at_startup μ‹œμŠ€ν…œ λ³€μˆ˜λ₯Ό OFF둜 μ„€μ •ν•  수 μžˆλ‹€. μ„œλ²„κ°€ μ’…λ£Œλ  λ•Œ 버퍼 ν’€μ˜ λ‚΄μš©μ„ λ€ν”„ν•˜μ§€ μ•Šκ³ μž ν•˜λ©΄ innodb_buffer_pool_dump_at_shutdown μ‹œμŠ€ν…œ λ³€μˆ˜λ₯Ό OFF둜 μ„€μ •ν•˜λ©΄ λœλ‹€. 8.0 λ²„μ „μ—μ„œ κΈ°λ³Έ 값은 λͺ¨λ‘ ON이닀.

λ…λ¦½λœ MySQL μ„œλ²„

MySQL μ„œλ²„κ°€ 기동 쀑인 μž₯비에 μ›Ή μ„œλ²„λ‚˜ λ‹€λ₯Έ 배치 ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜κ³  μžˆλ‹€λ©΄ 쿼리의 μ„±λŠ₯이 영ν–₯받을 수 μžˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ MySQL μ„œλ²„λΏ μ•„λ‹ˆλΌ ν…ŒμŠ€νŠΈ 쿼리λ₯Ό μ‹€ν–‰ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œκ·Έλž¨μ΄λ‚˜ λ„€νŠΈμ›Œν¬μ˜ 영ν–₯ μš”μ†Œλ„ κ³ λ €ν•΄μ•Ό ν•œλ‹€.

쿼리 ν…ŒμŠ€νŠΈ 횟수

μ‹€μ œ 쿼리의 μ„±λŠ₯ ν…ŒμŠ€νŠΈλ₯Ό MySQL μ„œλ²„κ°€ μ›Œλ°μ—…λœ μƒνƒœ(μΊμ‹œλ‚˜ 버퍼가 μ€€λΉ„)μ—μ„œ 진행할지 μ•„λ‹ˆλ©΄ μ½œλ“œ μƒνƒœ(μΊμ‹œλ‚˜ 버퍼가 λͺ¨λ‘ μ΄ˆκΈ°ν™”λœ μƒνƒœ)μ—μ„œ 진행할지도 κ³ λ €ν•΄μ•Ό ν•œλ‹€. 보톡 일반적인 쿼리 μ„±λŠ₯ ν…ŒμŠ€νŠΈλŠ” μ›Œλ°μ—…λœ μƒνƒœλ₯Ό κ°€μ •ν•˜κ³  ν…ŒμŠ€νŠΈν•˜λŠ” νŽΈμ΄λ‹€.

OS의 μΊμ‹œλ‚˜ MySQL의 버퍼 ν’€, ν‚€ μΊμ‹œλŠ” κ·Έ 크기가 μ œν•œμ μ΄λΌμ„œ μΏΌλ¦¬μ—μ„œ ν•„μš”λ‘œ ν•˜λŠ” λ°μ΄ν„°λ‚˜ 인덱슀 νŽ˜μ΄μ§€λ³΄λ‹€ 크기가 μž‘μœΌλ©΄ ν”ŒλŸ¬μ‹œ μž‘μ—…κ³Ό μΊμ‹œ μž‘μ—…μ΄ λ°˜λ³΅ν•΄μ„œ λ°œμƒν•˜λ―€λ‘œ 쿼리λ₯Ό ν•œ 번 μ‹€ν–‰ν•΄μ„œ λ‚˜μ˜¨ κ²°κ³Όλ₯Ό κ·ΈλŒ€λ‘œ μ‹ λ’°ν•΄μ„œλŠ” μ•ˆ λœλ‹€. ν…ŒμŠ€νŠΈ ν•˜λ €λŠ” 쿼리λ₯Ό λ²ˆκ°ˆμ•„ κ°€λ©΄μ„œ 6~7번 정도 μ‹€ν–‰ν•œ ν›„, 처음 ν•œλ‘ 번의 κ²°κ³ΌλŠ” 버리고 λ‚˜λ¨Έμ§€ 결과의 평균값을 κΈ°μ€€μœΌλ‘œ λΉ„κ΅ν•˜λŠ” 것이 μ’‹λ‹€. μ²˜μŒμ—λŠ” OS μΊμ‹œλ‚˜ MySQL의 버퍼 ν’€κ³Ό ν‚€ μΊμ‹œκ°€ μ€€λΉ„λ˜μ§€ μ•Šμ„ λ•Œκ°€ λ§Žμ•„μ„œ λŒ€μ²΄λ‘œ λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ˜λŠ” 편이라 νŽΈμ°¨κ°€ 클 수 μžˆλ‹€.

이 같은 사항을 κ³ λ €ν•΄ 쿼리의 μ„±λŠ₯을 λΉ„κ΅ν•˜λŠ” 것은 μ ˆλŒ€μ μΈ μ„±λŠ₯이 μ•„λ‹ˆλ‹€. μ‹€μ œ μ„œλΉ„μŠ€μš© MySQL μ„œλ²„μ—μ„œλŠ” ν˜„μž¬ ν…ŒμŠ€νŠΈ 쀑인 쿼리만 μ‹€ν–‰λ˜λŠ” 것이 μ•„λ‹ˆλΌ λ™μ‹œμ— 4~50개의 쿼리가 싀행쀑인 μƒνƒœμΌ 것이닀. 각 쿼리가 μžμ›μ„ μ μœ ν•˜κΈ° μœ„ν•œ κ²½ν•© 등이 λ°œμƒν•˜λ―€λ‘œ 항상 ν…ŒμŠ€νŠΈλ³΄λ‹€λŠ” 느린 처리 μ„±λŠ₯을 λ³΄μ΄λŠ” 것이 μΌλ°˜μ μ΄λ‹€.

Reference

μœ„ 글은 μ±… RealMySQL 8.0 2κΆŒμ„ κ΅¬μž…ν•˜μ—¬ 읽고 μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.