티스토리 뷰

카테고리 없음

MySQL 슬로우 쿼리 로그에서 ERP 일일 집계 쿼리를 추려내는 방법

생각방 2026. 11. 10. 20:36

목차


    아침에 ERP 매출 현황을 열었는데 전날 집계가 아직 반영되지 않았습니다. 운영 담당자가 작업 이력을 열어 보니 일일 집계 배치의 실행 시간이 평소보다 길었습니다. 같은 시간대의 MySQL 슬로우 쿼리 로그에는 매출 테이블을 읽는 SQL이 여럿 보입니다. 이 중 어떤 문장이 일일 집계에 쓰였는지 알아야 다음 점검 대상을 정할 수 있습니다.


    이 글은 ERP 운영을 바탕으로 구성한 설명용 업무 장면입니다. MySQL 8.4에서 배치 실행 이력과 슬로우 쿼리 로그를 대조해, 다음에 확인할 SQL을 좁히는 순서를 다룹니다.

    슬로우 쿼리에서 ERP 일일 집계 쿼리 추출

    배치 실행 이력으로 시간 범위 좁히기

    스케줄러에서 지연된 실행 건의 실제 시작·종료 시각과 재시도 이력을 먼저 확인합니다. 재시도한 경우 실행 건별로 시간 범위를 나눕니다. 전날 매출을 집계하는 작업이라면 SQL의 매출 기준일과 로그를 검색할 배치 실행일이 다를 수 있습니다.

    배치 이력과 DB 로그는 같은 시간대로 맞춥니다. 배치 이력은 한국 시간이고 FILE 로그의 시각이 Z로 끝난다면, 한국 시간으로 자정을 조금 넘긴 실행은 UTC로 전날에 해당합니다. log_timestamps는 파일 로그에 적용되며, TABLE로 남긴 로그는 조회 세션의 시간대를 확인합니다. MySQL 8.4 — log_timestamps

    로그 파일은 배치 종료 직후까지 여유를 두고 봅니다. MySQL은 문장 실행이 끝난 뒤 슬로우 로그에 쓰므로, 기록된 순서와 실행 순서가 다를 수 있습니다. 각 항목의 SET timestamp 또는 확장 항목이 있는 파일의 Start를 확인해 SQL 시작 시각을 배치 이력에 맞춥니다. MySQL 8.4 — 슬로우 쿼리 로그

    배치 실행 이력확인으로 시간 범위 좁히기

    집계 SQL을 식별하는 세 가지 단서

    매출 테이블 이름만으로는 일일 집계와 보고서 조회가 섞입니다. 배치 정의나 애플리케이션 로그에서 그 작업이 실제로 읽는 테이블, 날짜 조건, 집계 단위를 확인한 다음 같은 조건이 보이는 문장을 추립니다. 예를 들어 일일 집계가 전일 매출을 매장별로 묶는 작업이라면, 매출 테이블을 읽더라도 월간 조회이거나 상품별로 묶는 SQL은 후보에서 뺄 수 있습니다.

    대조 항목 확인할 내용
    접속 정보 배치가 연결한 MySQL 인스턴스와 DB 계정
    조회 범위 원본 테이블과 WHERE에 들어간 업무 기준일
    집계 단위 GROUP BY의 묶음 기준과 SUM·COUNT 등 집계 방식

    DB 계정을 여러 업무가 공유한다면 계정은 보조 단서로 씁니다. SQL 형태까지 같은 문장이 남으면, 애플리케이션이 MySQL 연결 ID를 기록했고 FILE 로그에 Thread_id가 있을 때 두 값을 시간과 함께 대조할 수 있습니다. 이런 연결 근거가 없으면 일치한 문장은 집계 후보로 남겨 둡니다. MySQL 8.4 — 슬로우 쿼리 로그

    집계 SQL을 식별하는 세 가지

    오래 걸린 문장과 반복된 문장의 구분

    후보가 몇 건이면 원본의 Query_time과 Rows_examined부터 확인합니다. Query_time은 문장 실행 시간이고, Rows_examined는 MySQL 서버 계층이 검사한 행 수입니다. 검사한 행은 많은데 Rows_sent가 적다면 날짜 조건과 실행 계획을 살펴볼 이유가 생깁니다. 집계 자체가 여러 행을 소수의 결과로 줄이는 작업이므로, 행 수 차이만으로 인덱스 문제를 판단하기는 어렵습니다. MySQL 8.4 — 슬로우 쿼리 로그

    같은 형태의 SQL이 많이 남았다면 배치 시간대와 집계 후보에 해당하는 FILE 로그 항목을 통째로 복사해 별도 파일을 만듭니다. 그 파일에서 다음 명령으로 누적 쿼리 시간 상위 유형을 봅니다.

    mysqldumpslow -l -s t -t 10 erp-batch-slow.log

    -l은 요약에서 잠금 시간을 별도로 빼지 않는 옵션입니다. 평균은 -s at, 횟수는 -s c로 따로 비교합니다. 요약 도구는 날짜 같은 실제 값을 일반화하므로 기준일이나 재시도 여부는 원본에서 확인합니다. MySQL 8.4 — mysqldumpslow

    후보가 없다면 당시 slow_query_log와 log_output 설정, long_query_time과 min_examined_row_limit을 확인합니다. 여러 SQL이 각각 기록 기준에 못 미쳐도 배치 전체는 길어질 수 있습니다. ERP 작업 이력에서 SQL 호출 횟수와 DB 조회 전후 단계도 함께 살펴봅니다. 로그 출력 대상 설정 · 슬로우 쿼리 기록 조건

    결론

    지연 건을 정리할 때는 배치 실행 시간대, 집계로 분류한 근거, 오래 걸린 한 건인지 반복된 유형인지를 함께 남깁니다. 다음 조사에서는 후보 SQL의 날짜 조건과 실행 계획을 EXPLAIN으로 확인합니다. EXPLAIN ANALYZE는 SQL을 실제로 실행하므로, 부하가 큰 집계의 실측은 검증 환경에서 진행합니다. MySQL 8.4 — EXPLAIN

    참고자료