php - max_questions - 保持分数 [mysql/php]

标签 php mysql

我正在使用 php/MySql 运行一个网络应用程序。

我正在移动和转换大量数据并尝试在短时间内完成,因此我正在运行多个并行 session 。

我的应用程序位于共享服务器上,因此我无权更改整个参数堆(包括 max_questions)。

我经常遇到超出 max_questions 的错误,这令人沮丧。

我试图简化我的代码以尽量减少问题(寻找将多个查询合并为一个查询的方法),但这只起到了很小的帮助。

鉴于我无权更改 max_questions 值;无论如何,我可以读取我已经用完的最大问题数,以便我可以限制执行以保持在限制以下吗?

因此,目前我正在启动通宵作业,这些作业可能会在几个小时后失败,而如果我将它们放慢速度以比如说 80% 的速度运行,它们可能会运行整整 10 个小时。

无论如何,我是否可以在任何时间点查看我是否超过了我的津贴的 95%,从而在这种情况下减慢我的处理速度?

感谢任何建议。

最佳答案

如果您对 MySQL 的轰炸速度太快,那么将查询捆绑在一起并不重要——即使将它们捆绑在一起是让您的脚本更快完成的好主意。您将简单地使用更复杂的查询来达到极限。您可以使用 usleep要限制执行,您必须将限制间隔考虑到延迟,以确保您的脚本没有时间执行超出限制的每小时查询。

首先找出max_questions 的值,即最大值。单个用户的每小时查询。 (在 db/table mysql/user 中定义。)然后注册脚本的开始时间,并记录执行了多少查询。当您接近限制时,将您的脚本设置为休眠直到 60 分钟已满,然后重置计时器。如果您结合使用这种方法和持续的微 sleep 限制,您就不太可能达到您的主机可能设置的其他限制(例如 max_user_connections)。

如果您的主机允许您拥有多个可以访问单个数据库的 MySQL 用户,您可以为每个并行 session 设置一个单独的用户,或者在您的数据库连接例程中设置一个用户旋转器。 (如果没有,您可以拆分数据库,如果可以隔离流程的不同方面,并将不同的任务委托(delegate)给不同的用户。在这一点上,我宁愿以每月 5 美元的价格获得基本的 VPS。)

一般引用,链接到 Account Resource Limits 上的 MySQL 手册.创建或更改用户时,使用 MAX_QUERIES_PER_HOUR,它转换为 max_questions 列。如果您拥有所需的权限,则可以发出 FLUSH USER_RESOURCES 语句来重置 max_user_connections 以外的使用限制的计数器(将重置所有每小时限制)。

编辑:您可以配置数据库以将用户统计信息保存在 mysql 数据库下的表中。在您的配置中设置 userstat = 1,重新启动服务器,然后可以通过 SHOW USER_STATISTICS 获得统计信息。这至少适用于 MySQL 的 MariaDB(info)和 Percona(info)分支;但是我似乎找不到有关 MySQL 本身的信息,它可能需要安装第三方插件。

关于php - max_questions - 保持分数 [mysql/php],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41495214/

相关文章:

php - CakePHP 2.x 使用 HABTM 连接表中的数据检索/查询

mysql - 如何从sql表中查找父子树

mysql - SQL 查询中的\% 和\\是什么意思?

mysql - 如何在 UPDATE mysql 查询中使用 JOIN

MYSQL 仅在用户订阅组时显示帖子

php - 使用 IMAP 和 PHP 保存附件服务器

php - 如何在网络服务器中执行 CUDA 文件 (PHP)

php - 通过短语或单独的关键字搜索 mysql 数据库

php - 在 YII2 中检查 mysql 连接的最佳方法

mysql - 按 created_at 和 updated_at 的顺序选择一条记录两次