MySQL 쿼리 타임아웃 설정 - MAX_EXECUTION_TIME

MySQL에서 쿼리를 실행하다 보면, 클라이언트쪽이 아니라 서버쪽에서 실행시간을 제어하고 싶을 때가 있다. 너무 실행시간이 길어지는 경우 kill을 하면 좋겠지만, 클라이언트와 서버간 중간 커넥션이 끊어지면 트래킹하기도 어렵다. 만약, 조건(?)만 만족한다면 다음의 옵션을 검토해 보자.


    사용 옵션 - MAX_EXECUTION_TIME(n)

    제목에도 썼듯이, 사용할 옵션은 MAX_EXECUTION_TIME이다. 환경 변수나, conf로 설정하게 되면 여러 쿼리들에 적용되는 부작용을 겪을 수도 있다. 따라서, 쿼리 힌트로 사용하는 것이 현실적이라고 생각한다.

    SELECT /*+ MAX_EXECUTION_TIME(n) */ * FROM ...

    형식으로 사용하면 된다. n은 ms 값이다.


    사전 조건

    단, 이 옵션을 사용하기 위한 사전 조건이 있는데, MySQL의 버전이 5.7.4 이상이어야 한다. 이보다 낮은 버전에서는 사용해도 아무런 변화가 없다. MySQL의 버전은 다음 명령어로 확인할 수 있다.

    SELECT version();
    
    8.0.20

    동작 확인

    보통은 실행하는데 얼마 걸리지 않는 아래의 쿼리로 확인해 본다.

    SELECT
        col.TABLE_NAME,
        col.COLUMN_NAME,
        col.COLUMN_TYPE,
        tab.AUTO_INCREMENT
    FROM
         information_schema.TABLES tab,
         information_schema.COLUMNS col
    WHERE
        col.TABLE_NAME = tab.TABLE_NAME;

    그런데, 이 쿼리에 위의 힌트를 적용해 보았다. 실행이 금방 끝나기 때문에 n 값을 작게 지정했다. (n = 20)

    SELECT
        /*+ MAX_EXECUTION_TIME(20) */
        col.TABLE_NAME,
        col.COLUMN_NAME,
        col.COLUMN_TYPE,
        tab.AUTO_INCREMENT
    FROM
         information_schema.TABLES tab,
         information_schema.COLUMNS col
    WHERE
        col.TABLE_NAME = tab.TABLE_NAME;

    를 실행하면,

    스크린샷 하단에서 볼 수 있듯이,

    [HY000][3024] Query execution was interrupted, maximum statement execution time exceeded

    와 같은 에러 메시지가 발생하면서 쿼리가 강제로 종료되었다.


    MySQL 공식 문서 확인 (사용시 주의 사항)

    https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html#optimizer-hints-execution-time

    1. 복합 SELECT 문의 경우, 복합문 전체에 적용되며 힌트는 첫번째 SELECT 문에 표기할 것
    2. 읽기 전용 SELECT 문에만 적용
    3. STORED PROCEDURE에는 적용되지 않음

    댓글(0)

    Designed by JB FACTORY