我正在使用php / MySql运行一个web应用程序。
我正在移动和转换大量数据,并试图在短时间内做到这一点,因此我正在运行一些并行会话。
我的应用程序位于共享服务器上,因此我无法更改整个参数堆(包括max_questions)。
在令人沮丧的频繁基础上,我遇到了超出max_questions的错误。
我试图简化我的代码,以尽量减少问题(寻找将多个查询合并为一个查询的方法),但这只起到了很小的作用。
考虑到我没有权限更改max_questions值;我是否可以从我的最大值中读取多少个问题,这样我就可以控制执行,使其保持在极限以下?
因此,目前我正在启动通宵工作,这些工作可能在几个小时后就会失败,而如果我放慢速度,以80%的速度运行,他们可能会跑完整整10个小时。
我是否可以看到,在任何时候,我的免税额都在95%以上,因此在这种情况下,我的处理速度就会放慢?
感谢你的建议。
发布于 2017-01-05 22:12:23
如果您对MySQL的轰击太快,那么打包您的查询并不重要--即使打包它们是一个好主意,让您的脚本更快地完成。您只需使用更复杂的查询即可达到极限。您可以使用usleep来节流执行,然后必须将节流间隔调整为延迟,以确保脚本没有时间执行超出限制的每小时查询。
首先找出max_questions的值,或最大值。对单个用户的每小时查询。(在db/table mysql/user中定义)然后注册脚本的启动时间,并计算执行了多少次查询。当您接近极限时,将您的脚本设置为休眠到60分钟满,然后重置计时器。如果您使用这种方法和固定的微睡眠节流阀相结合,您就不太可能达到主机可能存在的其他限制(例如max_user_connections)。
如果主机允许有多个可以访问单个数据库的MySQL用户,则可以为每个并行会话设置一个单独的用户,或者在DB连接例程中设置一个用户旋转器。(如果没有,您可以拆分数据库,如果可以分离流程的不同方面,并将不同的任务委托给不同的用户)。在那个时候,我宁愿给自己买一个基本的VPS,每月5美元。)
一般参考,链接到MySQL手册上的帐户资源限制。在创建或更改用户时,将使用MAX_QUERIES_PER_HOUR,这将转换为max_questions列。如果您具有所需的权限,则可以发出一条FLUSH USER_RESOURCES语句来重置除max_user_connections之外的计数器的使用限制(将重置所有小时限制)。
编辑:您可以将数据库配置为将用户统计数据保存在mysql数据库下的表中。在您的配置中设置userstat = 1,重新启动服务器,并使用SHOW USER_STATISTICS提供统计信息。这至少适用于MariaDB (信息)和Percona (信息)的MySQL分叉;然而,我似乎找不到MySQL本身的相关信息,它可能需要安装第三方插件。
https://stackoverflow.com/questions/41495214
复制相似问题