当前位置:  开发笔记 > 编程语言 > 正文

如何设置mysql查询的最大执行时间?

如何解决《如何设置mysql查询的最大执行时间?》经验,为你挑选了3个好方法。

我想为php中的set_time_limit()设置sql查询的最大执行时间.我能怎么做 ?



1> Westy92..:

我以为它已经存在了一段时间,但根据这个,

MySQL 5.7.4引入了为顶级只读SELECT语句设置服务器端执行时间限制的能力,以毫秒为单位.

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

请注意,这仅适用于只读SELECT语句.

更新:此变量已添加到MySQL 5.7.4中,并max_execution_time在MySQL 5.7.8中重命名.(来源)


您将不得不重写该查询,例如从表中选择/ * + MAX_EXECUTION_TIME(1000)* / *

2> goat..:

如果您正在使用mysql本机驱动程序(自php 5.3以来常见)和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配置其mysql客户端库,以便在您的php代码开始访问结果中的行之前,将查询的整个结果集提取到内存中.传输大量结果可能需要很长时间.我们禁用它,否则我们冒着在等待缓冲完成时可能会超时的风险.

请注意,我们需要检查超出时间限制的两个地方:

实际的查询执行

获取结果(数据)

您可以在PDO和常规mysql扩展中完成类似的操作.它们不支持异步查询,因此您无法在查询执行时设置超时.但是,它们确实支持无缓冲的结果集,因此您至少可以在获取数据时实现超时.

对于许多查询,mysql几乎可以立即开始将结果流式传输给您,因此单独的无缓冲查询将允许您在某些查询上有效地实现超时.例如,a

select * from tbl_with_1billion_rows

可以立即开始流式传输,但是,

select sum(foo) from tbl_with_1billion_rows

需要先处理整个表,然后才能开始将第一行返回给您.后一种情况是异步查询的超时将为您节省的时间.它还可以避免普通的旧死锁和其他东西.

ps - 我没有在连接本身上包含任何超时逻辑.


这不会阻止sql server上正在进行的mysql查询.但是,这是对不同问题的出色解决方案.

3> Rafa..:

您可以在其他SO问题上找到答案:

MySQL-我可以限制查询运行的最大时间吗?

在数据库服务器上每秒运行一次的cron作业,进行连接并执行以下操作:

显示流程清单

查找查询时间大于您的最大期望时间的所有连接

对每个进程运行KILL [进程ID]

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有