복붙노트

[SQL] 어떻게 MySQL의 쿼리의 최대 실행 시간을 설정하는 방법?

SQL

어떻게 MySQL의 쿼리의 최대 실행 시간을 설정하는 방법?

나는 PHP에서하고 set_time_limit 같은 SQL 쿼리 ()의 최대 실행 시간을 설정하고 싶습니다. 어떻게 할 수 있습니까?

해결법

  1. ==============================

    1.나는 그것이이에 따라 약간의 시간이 주위에 있었지만있다 생각

    나는 그것이이에 따라 약간의 시간이 주위에 있었지만있다 생각

    SELECT 
    /*+ MAX_EXECUTION_TIME = 1000 */ --in milliseconds
    * 
    FROM table;
    

    참고이 읽기 전용 SELECT 문에 대해 작동합니다.

    업데이트 :이 변수는 MySQL은 5.7.4에서 추가와 MySQL 5.7.8에서 max_execution_time이라는 이름이 바뀌 었습니다. (출처)

  2. ==============================

    2.당신은 MySQL의 기본 드라이버 (일반적인 PHP 5.3부터), 그리고 mysqli 확장을 사용하는 경우 비동기 쿼리와 함께이 작업을 수행 할 수 있습니다 :

    당신은 MySQL의 기본 드라이버 (일반적인 PHP 5.3부터), 그리고 mysqli 확장을 사용하는 경우 비동기 쿼리와 함께이 작업을 수행 할 수 있습니다 :

    <?php
    
    // Here's an example query that will take a long time to execute.
    $sql = "
        select *
        from information_schema.tables t1
        join information_schema.tables t2
        join information_schema.tables t3
        join information_schema.tables t4
        join information_schema.tables t5
        join information_schema.tables t6
        join information_schema.tables t7
        join information_schema.tables t8
    ";
    
    $mysqli = mysqli_connect('localhost', 'root', '');
    $mysqli->query($sql, MYSQLI_ASYNC | MYSQLI_USE_RESULT);
    $links = $errors = $reject = [];
    $links[] = $mysqli;
    
    // wait up to 1.5 seconds
    $seconds = 1;
    $microseconds = 500000;
    
    $timeStart = microtime(true);
    
    if (mysqli_poll($links, $errors, $reject, $seconds, $microseconds) > 0) {
        echo "query finished executing. now we start fetching the data rows over the network...\n";
        $result = $mysqli->reap_async_query();
        if ($result) {
            while ($row = $result->fetch_row()) {
                // print_r($row);
                if (microtime(true) - $timeStart > 1.5) {
                    // we exceeded our time limit in the middle of fetching our result set.
                    echo "timed out while fetching results\n";
                    var_dump($mysqli->close());
                    break;
                }
            }
        }
    } else {
        echo "timed out while waiting for query to execute\n";
        var_dump($mysqli->close());
    }
    

    내가 mysqli_query에주는거야 플래그는 중요한 일을 수행. 그것은 힘을 우리가 더 많은 코드 자세한 사용하면서, 비동기 모드를 활성화하기 위해 클라이언트 드라이버를 알려줍니다,하지만 우리가 타임 아웃을 사용할 수 있습니다 (당신이 원하는 경우도 동시 쿼리를 실행할!). 다른 플래그는 메모리에 전체 결과 집합을 버퍼링하지 않는 클라이언트를 알려줍니다.

    기본적으로 PHP는 PHP 코드가 결과 행을 액세스하기 시작할 수 있습니다 전에 메모리에 쿼리의 전체 결과 세트를 가져 오기 위해 MySQL의 클라이언트 라이브러리를 구성합니다. 이것은 큰 결과를 전송하는 데 시간이 오래 걸릴 수 있습니다. 우리는 그렇지 않으면 우리가 완료 될 때까지 버퍼링을 기다리는 동안 우리가 시간 초과 될 수 있습니다 것이 위험, 그것을 해제합니다.

    주 우리는 시간 제한을 초과 확인해야하는 두 장소가 있다는 것을 :

    당신은 PDO와 일반 MySQL의 확장 유사한 수행 할 수 있습니다. 쿼리 실행 시간에 시간 제한을 설정할 수 없습니다, 그래서 그들은, 비동기 쿼리를 지원하지 않습니다. 당신은 적어도 데이터의 인출에 제한 시간을 구현할 수 있도록 그러나, 그들은 버퍼링 결과 세트를 지원 수행합니다.

    많은 쿼리를 들어, MySQL은 즉시 당신에게 결과를 스트리밍을 시작할 수있다, 그래서 버퍼링 쿼리는 혼자가 어느 정도 효율적으로 특정 쿼리에 대한 시간 제한을 구현할 수 있습니다. 예를 들어,

    select * from tbl_with_1billion_rows
    

    바로 행을 스트리밍을 시작할 수 있지만,

    select sum(foo) from tbl_with_1billion_rows
    

    그것이 당신에게 첫 번째 행을 반환 시작하기 전에 전체 테이블을 처리 할 필요가있다. 비동기 쿼리에 대한 제한 시간을 절약 할 수있는 곳 후자의 경우이다. 또한 평범한 구식 교착 상태 및 기타 물건에서 당신을 저장합니다.

    추신 - 내가 연결 자체에 어떤 시간 제한 로직을 포함하지 않았다.

  3. ==============================

    3.당신이 다른 S.O.에 대한 답을 찾을 수 있습니다 질문:

    당신이 다른 S.O.에 대한 답을 찾을 수 있습니다 질문:

    MySQL은 - 나는 실행에 쿼리에 허용되는 최대 시간을 제한 할 수 있습니까?

  4. ==============================

    4.같은 쿼리를 다시 작성하십시오

    같은 쿼리를 다시 작성하십시오

  5. ==============================

    5.pt_kill 등을위한 옵션이 있습니다. 그러나 주문형 지속적으로 모니터링하지 않습니다. 그것은 @Rafa가 무엇을 제안한다. 그러나 가까운 크론과 함께 오는 방법의 힌트에 대한 --sentinel 참조하십시오.

    pt_kill 등을위한 옵션이 있습니다. 그러나 주문형 지속적으로 모니터링하지 않습니다. 그것은 @Rafa가 무엇을 제안한다. 그러나 가까운 크론과 함께 오는 방법의 힌트에 대한 --sentinel 참조하십시오.

  6. from https://stackoverflow.com/questions/415905/how-to-set-a-maximum-execution-time-for-a-mysql-query by cc-by-sa and MIT license