我正在使用php / MySql运行Web应用程序。
我正在移动并转换大量数据并尝试在很短的时间内完成,因此我正在运行多个并行会话。
我的应用程序位于共享服务器上,因此我无权更改整堆参数(包括max_questions)。
我遇到了令人沮丧的频繁超出max_questions错误。
我试图简化我的代码以最大限度地减少问题(寻找将多个查询合并为一个的方法),但这只是略有帮助。
鉴于我无权更改max_questions值;无论如何,我可以读出我用尽了多少问题,以便我可以限制执行以保持低于限制?
所以目前我正在开始一夜之间失败的工作,但是如果我放慢速度跑到80%,他们可能会跑整整10个小时。
无论如何我可以看到我是否在任何时间点说我的95%的津贴,因此在这种情况下减慢我的处理速度?
感谢任何建议。
答案 0 :(得分:0)
如果你过快地轰炸MySQL,那么捆绑你的查询并不重要 - 即使捆绑它们是让你的脚本更快完成的好主意。您只需使用更复杂的查询即可达到极限。您可以使用usleep
来限制执行,然后您必须将您的限制时间间隔设置为延迟,以确保您的脚本没有时间执行超出限制的每小时查询。
首先找出max_questions
或最大值的值。每小时查询单个用户。 (在db / table mysql/user
中定义。)然后注册脚本的开始时间,并记录您执行的查询数。当您接近限制时,将脚本设置为休眠直到60分钟已满,然后重置计时器。如果您使用此方法和恒定微睡眠油门的组合,则您不太可能达到主机可能具有的其他限制(例如max_user_connections
)。
如果您的主机允许您拥有多个可以访问单个数据库的MySQL用户,则可以为每个并行会话设置单独的用户,或者在数据库连接例程中设置用户控制器。 (如果没有,你可以分割数据库,如果可以隔离过程的不同方面,并将不同的任务委托给不同的用户。那时,我宁愿给我一个基本的VPS,每月5美元。)< / p>
供一般参考,链接到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本身的信息,可能需要安装第三方插件。