<aside> 💡
요약
MySQL8 버전 업그레이드 대비 Deprecated Hint, Functions 제거
</aside>
여러 서비스에 걸쳐 활용되고 있기 때문에 최소한의 영향을 가지는 서비스를 기반으로 MySQL 5.x 호환성 테스트와 성능 테스트를 진행 후 반영하기로 함.
간단한 성능 테스트
성능 테스트를 위해 쿼리 메모리 사용량 등을 모니터링 해야 하는데 이는 MySQL 에서 제공되고 있다. profile 을 활용하면 가능하다. 향후 Profile 도 Deprecated 되어 performance_schem 로 대체된다.
MySQL :: MySQL 8.4 Reference Manual :: 15.7.7.32 SHOW PROFILE Statement
MySQL :: MySQL 8.4 Reference Manual :: 29.19.1 Query Profiling Using Performance Schema
현 프로젝트는 MySQL 5.7 → 8.0.36 마이그레이션을 계획하고 있기에 profile 을 이용해 메모리, CPU 사용량 등을 확인 해보자.
-- profiling 은 세션 단위로 활성화
-- profiling deprecated 대신 performance_schem 활용 권고
-- profiling 옵션 확인 0 : off / 1 : on
select @@profiling;
-- 쿼리 프로파일링 활성화
set profiling=1; -- on
set profiling=0; -- off
모니터링 하고자 하는 QUERY 동작 후 ID 값을 기반으로 CPU 사용률 그리고 CODE 블럭 단위로 소요된 시간 등을 확인할 수 있다.
-- Query 별 총 소요 시간을 볼 수 있다.
SHOW profiles;
SELECT QUERY_ID, SUM(DURATION) AS TOTAL_TIME
FROM INFORMATION_SCHEMA.PROFILING
WHERE QUERY_ID = {Query_ID}
ORDER BY SEQ;
-- Query 를 좀 더 상세하게 블록단위로 볼 수 있으며, Option 을 통해서 제공하는 Option 의 정보도 볼 수 있다.
SHOW profile FOR QUERY {Query_ID};
SHOW profile CPU FOR QUERY {Query_ID};
SELECT STATE, FORMAT(DURATION, 6) AS DURATION
FROM INFORMATION_SCHEMA.PROFILING
WHERE QUERY_ID = {Query_ID} ORDER BY SEQ;
프로파일링을 통해서 SELECT COUNT() + SELECT ~ LIMIT / SELECT SQL_CALC_FOUND_ROWS ~ LIMIT 2 가지의 경우의 CPU 사용량, 소요 시간을 기반으로 성능을 확인해보자.
테스트 Data 1,520,395 건
| 구분 | 총 소요 시간 ( 초 ) | 소요 시간 ( 초 ) | CPU 사용 시간 ( USER + SYSTEM ) ( 초 ) | CPU 사용 시간 ( USER + SYSTEM ) ( 초 ) | | --- | --- | --- | --- | --- | | SELECT COUNT() + SELECT ~ LIMIT | 0.397087 | COUNT() : 0.389429
SELECT ~ LIMIT : 0.007658 | 0.404771 | COUNT() : 0.403542
SELECT ~ LIMIT : 0.001229 | | SQL_CALC_FOUND_ROWS + FOUND_ROWS() | 1.387430 | SQL_CALC_FOUND_ROWS : 1.386942
FOUND_ROWS() : 0.000488 | 1.388153 | SQL_CALC_FOUND_ROWS : 1.387711
FOUND_ROWS() : 0.000442 |