Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 限制每个进程使用mysql_Php_Mysql_Cron_Limit_Query Performance - Fatal编程技术网

Php 限制每个进程使用mysql

Php 限制每个进程使用mysql,php,mysql,cron,limit,query-performance,Php,Mysql,Cron,Limit,Query Performance,我已经用标准灯配置了Debian VPS。 在这台服务器上,只有一个站点(shop)有几个cron作业——大部分是PHP脚本。其中之一是由Lynx浏览器执行的更新脚本,它发送大量查询。 当这个脚本运行时(需要3-4分钟才能完成),它会消耗所有MySQL资源,而站点几乎无法工作(页面生成时间为30-60秒,而不是1-2秒) 如何限制此脚本(即延长其执行时间限制可用资源)以允许其他服务正常运行?我相信这个问题有一个简单的解决办法,但找不到。看来我的谷歌超级能力在过去两天是有限的 您无权修改有问题的脚

我已经用标准灯配置了Debian VPS。 在这台服务器上,只有一个站点(shop)有几个cron作业——大部分是PHP脚本。其中之一是由Lynx浏览器执行的更新脚本,它发送大量查询。 当这个脚本运行时(需要3-4分钟才能完成),它会消耗所有MySQL资源,而站点几乎无法工作(页面生成时间为30-60秒,而不是1-2秒)


如何限制此脚本(即延长其执行时间限制可用资源)以允许其他服务正常运行?我相信这个问题有一个简单的解决办法,但找不到。看来我的谷歌超级能力在过去两天是有限的

您无权修改有问题的脚本,因此修复此问题需要数据库管理员的工作,而不是编程工作。您的任务称为调优MySQL数据库

(我想你已经向你的供应商求助了,他们拒绝了。)

在脚本运行时使用Ron top或htop。CPU固定在100%吗?拉姆累了吗

1) 只需接受它,并在一天中网站访问者不多的时候运行更新脚本。相当容易,但不是真正的解决方案

2) 作为实验,将RAM添加到VPS实例中。它可以让MySQL在RAM中完成它目前放在硬盘上临时表中的所有事情。如果有帮助的话,这可能是一种解决您的问题的方法,只需少量的工作和更高的服务器租用费

3) 添加一些索引以加快脚本中的查询速度,从而加快每个查询的完成速度。问题是,哪些索引会有所帮助?(仅仅随机添加索引通常没有多大帮助。)

首先,找出哪些查询比较慢。在脚本运行时,给出SHOW FULL PROCESSLIST repeatedluy命令。结果中的Info列显示所有正在运行的查询。将它们复制到文本文件中以保留它们。(或者你可以使用MySQL的慢速查询日志,你可以在线阅读。)

其次,分析最严重的违规查询,看看是否有明显的索引要添加。告诉您如何做通常超出了堆栈溢出回答的范围。您可能会问另一个关于特定查询的问题。在你做之前,请 ,并请注意有关查询性能的部分

3) 您的脚本可能正在从用户访问您的网站时也需要更新的表中选择许多行,或者使用SELECT汇总许多行。在这种情况下,您的访问者可能正在等待这些选择完成。如果可以更改脚本,可以在长时间运行选择之前将此语句放在正确位置

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
这允许它后面的SELECT语句执行“脏读”,在该语句中,它可能会获得更新行的早期版本

或者,如果您能够找出如何将一条语句插入到隐藏的脚本中,请在它打开数据库会话后立即插入该语句

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
但是,如果无法访问源代码,您只有一种方法来确定这是否是问题所在。也就是说,在脚本运行之前,从特权帐户访问MySQL服务器,并发出这些SQL命令

 SHOW VARIABLES LIKE 'tx_isolation';
 SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITED;
然后查看性能问题是否得到改善。在脚本完成后将其设置回原位,可能是这样(取决于上面检索到的tx_隔离值)

警告如果应用程序依赖于事务一致性,则对隔离级别的永久全局更改可能会使应用程序出错。这只是一个实验


4) 骚扰脚本作者以解决此问题。

查询速度慢?高CPU?高I/O?然后您必须查看查询。您不能“调整您的方式以解决性能问题”。调整可能会给您带来几%的改进;修复索引和查询可能会给您带来更多的改进


有关查找“最差”查询的信息,请参阅;然后带着
选择
解释
,以及
显示创建表
返回以获取帮助。

您使用的数据库引擎是什么?innodb或myisam@coder我使用InnoDbI可以在最常用的列上创建索引,并查看您的联接。不幸的是,它不是我的脚本(而且不清楚)所以不能优化它。谢谢你的详细回答。这真的很有帮助。嗨,谢谢你的关注。因为这是一个相当古老的话题,它已经被解决了,或者我应该说,它被传递给了在系统管理方面有更丰富经验的人(我是一名程序员)。据我所知,他们仍然会遇到这个脚本的问题,但不知道细节&目前无法访问服务器。
 SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITED;