2023. 12. 13. 16:55ใDatabase
๋๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ ์ฌ์ฉ์์ ์ ์ฅ์์๋ ์ค์ํ์ง๋ง DB ๋ ๋ฒจ์ ํจ์จ์ ์์๊ด๋ฆฌ๋ฅผ ์ํด์๋ ๊ผญ ํ์ํ ์ผ์ด๋ค.
์ด๋ป๊ฒ ์ฟผ๋ฆฌ์ ์คํ ์๊ฐ๋ค์ ํ์ธํ ์ ์์๊น? ์ง์ ์ผ์ผ์ด ์คํ์์ผ๋ณด๋ฉด์ ์๊ฐ์ ์ฌ์ผ ํ๋?
๋คํํ๋ ์ผ๋ถ DB๋ค์ ๊ทธ๋ค ์๋ฒ์์ ์ํ๋๋ ์ฟผ๋ฆฌ ์ค ์๋ฒ์ ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ Slow Query(์ฌ๋ก์ฐ ์ฟผ๋ฆฌ)๋ค์ ๋ฐ๋ก ์ ์ฅํด๋๊ณ , ์ด๋ฅผ ๊ฐ๋ฐ์๋ค์ด ํ์ธํ ์ ์๋๋ก ํ๊ณ ์๋ค.
์ด ๊ธ์์๋ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ์ ํ์ธ์ด ์ฉ์ดํ ๋ DB, Mysql๊ณผ Postgresql์์ ์ด๋ฅผ ์ค์ ํ๊ณ ํ์ธํ๋ ๋ฒ์ ๋ค๋ฃจ๋ ค๊ณ ํ๋ค.
Mysql
์ค์ ๋ฒ
Mysql์์๋ ์๋ ๋ด์ฉ์ my.cnf์ ์ถ๊ฐํ๋ฉด 1์ด ์ด์ ๊ฑธ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ๋ก ์์ ํ๊ณ ์ด์ ๋ํ ์์ง์ด ์์๋๋ค. ๋ฌผ๋ก ์ค์ ํ์ผ์ ์์ ํ๊ธฐ ๋๋ฌธ์ DB ์ฌ์์์ ํ์ํ๋ค.
slow_query_log = 1
long_query_time = 1
์ ์ค์ ์ด ์ ๋๋ก ์ ์ฉ๋์๋์ง ํ์ธํ๊ธฐ ์ํด์๋, mysql์ ์ ์ํ์ฌ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํด๋ณด๋ฉด ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
SHOW GLOBAL VARIABLES LIKE 'slow_query_log';
SHOW GLOBAL VARIABLES LIKE 'long_query_time';
์ ๋๋ก ์ต์ ์ด ์ ์ฉ๋์๋ค๋ฉด, slow_query_log ๊ฐ์ 'ON'์ด ๋๊ณ , long_query_time ๊ฐ์ 1์ด ๋์ด์๋ค.
ํ์ธ๋ฒ
์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ์ค์ ์ ์ ๋๋ก ์ ์ฉํ๊ณ ๋ ๋ค์, ์ค์ ํ ๊ธฐ์ค ์๊ฐ์ ๋๊ธฐ๋ ์ฟผ๋ฆฌ์ ๋ํด์๋ ๋ก๊ทธ์ ์์ด๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด์๋ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊ทธ ํ์ผ์ ์์น๋ฅผ ๋จผ์ ํ์ธํด์ผ ํ๋ค. ์ด๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
SHOW GLOBAL VARIABLES LIKE 'slow_query_log_file';
ํ์ธํ ๋ก๊ทธ ํ์ผ์ ์์น๋ฅผ ๊ณง๋ฐ๋ก ์ด์ด์ ๋ด์ฉ์ ํ์ธํด๋ ๋์ง๋ง, ๋ก๊ทธ๊ฐ ๋ง์ด ์์ฌ์๋ ๊ฒฝ์ฐ์ ์ฝ๊ธฐ๊ฐ ๊ฝค๋ ์ด๋ ต๊ธฐ ๋๋ฌธ์ mysqldumpslow ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ธํ๋ฉด ๋ ๋ณด๊ธฐ ์ฌ์์ง๋ค.
๋ช ๋ น์ด๋ฅผ ์คํํ ๋ ๋ถ๊ฐ์ ์ผ๋ก ์ค ์ ์๋ ์ต์ ๋ค์ด ๋ค์ํ๋, ํด๋น ๊ธ์์๋ ํ๊ท ์คํ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์ 10๊ฐ์ ์ฟผ๋ฆฌ ๋ง์ ์ถ๋ ฅํ๋๋ก ์ต์ ์ ์ฃผ๋๋ก ํ๊ฒ ๋ค. ๋ ์์ธํ ์ต์ ์ ๋ํ ์ค๋ช ์ ์๋ ๋งํฌ์ ๊ณต์๋ฌธ์๋ฅผ ํ์ธํด๋ณด๋ฉด ์ ๋์์๋ค.
ํ๊ท ์คํ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์ 10๊ฐ์ ์ฟผ๋ฆฌ ๋ง์ ์ถ๋ ฅํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ํํด์ฃผ๋ฉด ๋๋ค.
mysqldumpslow -s at -t 10 {์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊ทธํ์ผ ๊ฒฝ๋ก}
๋ช ๋ น์ด๋ฅผ ์ํํ๋ฉด ์ด์ ๊ฒฝ๋ก์ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊ทธํ์ผ์ ์ฝ์ด๋ค์ด๊ณ ์ด๋ฅผ ํ ๋๋ก ๋ถ์ํ์ฌ ๊ฒฐ๊ณผ๋ฌผ์ ์ถ๋ ฅํ๋ค. ๋ก๊ทธ๊ฐ ๋ง์ด ์์ธ ๊ฒฝ์ฐ์ ๋ถ์ํ๋๋ฐ ์๊ฐ์ด ๋ ๋ค ์ ์๋ค.
Postgresql
PG์์๋ ๊ตฌ๊ธ๋ง ์ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ๋ฅผ ํ์ธํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ํฌ๊ฒ 3๊ฐ์ง ์ ๋ ์๋ค๊ณ ํ๋ค.
- ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ํ๋จ ๊ธฐ์ค ์๊ฐ์ ์ค์ ํ๊ณ ์ด๋ฅผ ์ด๊ณผํ๋ ์ฟผ๋ฆฌ๋ค์ ๋ก๊ทธ์ ์๋ ๋ฐฉ๋ฒ(Mysql์ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ๋ก๊ทธ ์ ์ฌ ๋ฐฉ์๊ณผ ์ ์ฌ)
- ์ ์ฒด ์๋ฒ ์คํ ์ฟผ๋ฆฌ์ ๋ํ ์คํ๊ณํ์ ๋ก๊ทธ์ ์ ์ฌ
- ์ ์ฒด ์๋ฒ ์คํ ์ฟผ๋ฆฌ์ ๋ํ ํต๊ณ๊ฐ์ ํ ์ด๋ธ(๋ทฐ)๋ฅผ ํตํด ํ์ธํ๋ ๋ฐฉ๋ฒ(pg_stat_statements)
์ด ์ค ์ฒซ๋ฒ์งธ ๋ฐฉ์์ด ์์์ ์ค๋ช ํ Mysql์ ๋ฐฉ์๊ณผ ์ ์ฌํ์ฌ ์ด๋ฅผ ์๊ฐํ๋ ค๊ณ ํ๋๋ฐ, ๋ก๊ทธ ํ์ผ ๋ถ์์ ๋์ ์งํํด์ฃผ๋ mysqldumpslow ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฐพ์ง ๋ชปํด์ ์ค์ง์ ์ผ๋ก ์ฌ์ฉ์ฑ์ด ๋ถ์กฑํ๋ค๊ณ ํ๋จํ๋ค.
๋์ ์ธ๋ฒ์งธ ๋ฐฉ์์ ๋ํด ์๊ฐํ๋๋ก ํ๊ฒ ๋ค.
์ค์ ๋ฒ
pg_stat_statements ํ์ฅ์ ํ์ฑํํ๊ธฐ ์ํด์๋ ์ฐ์ PG์ ์ค์ ํ์ผ์ธ postgresql.conf๋ฅผ ์์ ํด์ผ ํ๋ค.
ํ์ผ ๋ด shared_preload_libraries ๋ณ์๊ฐ ์ ์ธ์ด ๋์ด์๋์ง ํ์ธํ๊ณ , ์ ์ธ์ด ๋์ด์์ง ์๋ค๋ฉด ์๋์ฒ๋ผ ์์ฑํด์ค๋ค.
shared_preload_libraries = 'pg_stat_statements'
๋ง์ฝ ์ด๋ฏธ ์ ์ธ์ด ๋์ด ์๋ค๋ฉด ์ด๋ฏธ ์กด์ฌํ๋ ๋ฌธ์์ด ๋ด์ ์ฝค๋ง(,)๋ก ๊ตฌ๋ถํ๊ณ pg_stat_statements ๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
์ค์ ํ์ผ์ ์์ ํ ๋ค์, ์ฐ์ DB ์๋ฒ๋ฅผ ์ฌ์์ ํด์ฃผ์.
๊ทธ ๋ค DB ์๋ฒ์ ์ ์ํ์ฌ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํด์ ํ์ฅ์ ์คํํด์ฃผ์.
CREATE EXTENSION pg_stat_statements;
์ฌ๊ธฐ๊น์ง ์๋ค๋ฉด ์ด์ ์ฟผ๋ฆฌ๋ฅผ ํตํด ์๋ฒ ๋ด ์คํ๋ ์ฟผ๋ฆฌ๋ค์ ํต๊ณ๋ฅผ ํ์ธํ ์ ์๋ค.
ํ์ธ๋ฒ
pg_stat_statements ๋ทฐ๊ฐ ๊ฐ๋ ์นผ๋ผ์ ์ข ๋ฅ๊ฐ ๊ฝค๋ ๋ง์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐํ๋ค์ง ๋ชจ๋ฅด๊ฒ ์ผ๋, ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ฐ์ฅ ์ฌํํ ๋ฐฉ๋ฒ์ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
SELECT * FROM pg_stat_statements;
์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๊ฒฝ์ฐ, ํน์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ํ์, ์คํ ์๊ฐ(ํ๊ท , ์ต๋, ์ต์, ์ดํฉ), ๋ฒํผ ์บ์์์ ๊ฐ์ ธ์จ ๋ธ๋ก ์, ๋์คํฌ์์ ๊ฐ์ ธ์จ ๋ธ๋ก ์ ๋ฑ์ด ์ถ๋ ฅ๋๋๋ฐ ์ด์ ํด๋น ์นผ๋ผ ๋ฑ์ ํตํด ์กฐํํ๊ณ ์ถ์ ์์๋๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์กฐํ๋ฅผ ํ๋ฉด ๋ ํจ๊ณผ์ ์ธ ์ฌ๋ก์ฐ ์ฟผ๋ฆฌ ํ์ง๊ฐ ๊ฐ๋ฅํด์ง๋ค.
pg_stat_statements ํ์ฅ์ ๋ํ ์์ธํ ์ค๋ช ์ด๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋ ๋์ค๋ ์นผ๋ผ๋ค์ ๋ํ ์ค๋ช ์ด ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๋ค๋ฉด ์๋ ํ๊ธํ๋ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด๋ ๋ ๊ฒ ๊ฐ๋ค.
'Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ ์ฝ๋ ๋๋ค ์กฐํ๋ฅผ ํตํ ๋๊ด์ ๋ฝ ์ฑ๋ฅ ๊ฐ์ ๊ธฐ (with ์ฌ์ด๋ ํ๋ก์ ํธ) (1) | 2024.05.02 |
---|---|
Database PK ์์ฑ ์ ๋ต (without DB, Mysql) (3) | 2024.03.17 |
ํ์ด์ง๋ค์ด์ ๋ฐฉ๋ฒ๋ก ๋น๊ต(Offset vs Cursor) (0) | 2024.02.17 |
JOIN์ ์ ๋ง ๋๋ฆฐ๊ฐ (์ญ์ ๊ทํ) (0) | 2024.01.07 |