PHP 每小时获得 MySQL 次查询

PHP get amount of MySQL queries per hour

短: 有没有一种方法可以有效地获取在特定时间范围内(通过 PHP)执行的查询数量?

已满: 我目前 运行 是一个将被大量用户使用的前端 Web 应用程序 API。

我使用自己的自定义框架,该框架使用模型来完成所有数据魔术,它们主要执行 INSERT 和 SELECT。一个模型的一个函数可以对一个请求执行 5 到 10 个查询,而另一个函数可能每个请求执行 50 个或更多。

目前,我无法通过每秒执行(例如)500 个查询来检查我是否 "killing" 我的服务器。

我也不希望用户数量在第一周内增加到 200、500、1000 .. 并且到月底可能增加到 10.000 时出现意外。

我想按小时提取某种统计数据,这样我就可以了解平均值,并且我可以在一切失败之前处理性能和效率问题。将一些查询合并为一个 "bigger" 一个或类似的东西。

我读过的帖子建议只在我的代码中保留一个计数器,但这需要更多的查询,只是为了有一个数字。首选方法是在我的每小时统计脚本中添加一个选择器,returns 我已经为 x 处理请求量执行的查询量。

总结一下。 是否有任何其他选项来跟踪此金额?

额外。我应该担心和关心查询的数量吗?它们都是小的,只是为了快速执行而没有瓶颈或繁重的计算,我目前对一切的速度如此之快印象深刻 运行!

额外的额外。它在我们自己的 VPS 服务器上,所以我有完全的访问权限,而且我不限于 "basic" 函数或命令或类似的东西。

简答:使用慢日志。

完整答案:

在时间段的开始和结束时,执行

SELECT VARIABLE_VALUE AS Questions
     FROM information_schema.GLOBAL_STATUS
    WHERE VARIABLE_NAME = 'Questions';

然后取差值

如果计时不准,还要得到... WHERE VARIABLE_NAME = 'Uptime'才能得到时间(精确到秒)

但问题是...500 个非常快的查询可能不会像 5 个非常慢且复杂的查询那样有问题。我建议经过的时间可能是决定是否杀人的更好指标。

And... kill掉进程可能会出现一种莫名其妙的情况,顽皮的语句会长时间保持在"Killing"状态。 (参见 SHOW PROCESSLIST。)之所以会发生这种 可能 的原因是需要撤消该语句以保持数据的完整性。一个示例是单个 UPDATE 语句修改一百万行的所有行 table.

如果你在这种情况下进行杀戮,最好让它完成。

在不同的方向,如果你有一个单行 UPDATE 不使用索引,但需要 table 扫描,那么查询将花费很长时间并且可能比“500 次查询”给系统带来更多负担。 'cure' 可能会添加一个 INDEX

这一切该怎么办?使用慢日志。将 long_query_time 设置为一些较小的值。默认为 10(秒);这几乎没用。将其更改为 1 或更小的值。然后留意慢日志。我发现这是提防系统失控的最佳方式 告诉您如何修复。更多讨论:http://mysql.rjweb.org/doc.php/mysql_analysis#slow_queries_and_slowlog

请注意,slowlog 中的最佳指标既不是查询 运行 的次数,也不是 运行 的时长,而是两者的乘积。这是 pt-query-digest 的默认值。对于 mysqlslowdump,添加 -s t 会得到按该顺序排序的结果。