Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.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 - Fatal编程技术网

Php MySQL数千次更新,速度变慢

Php MySQL数千次更新,速度变慢,php,mysql,Php,Mysql,我需要运行一个PHP循环总共100000次(每个脚本运行大约10000次),每个循环大约有5个MySQL更新。当我运行循环50次时,需要3秒。当我运行循环1000次时,大约需要1300秒。正如您所看到的,MySQL的速度随着更新的增加而减慢了很多 这是一个示例更新: mysql_query("UPDATE table SET `row1`=`row1` +1 WHERE `UniqueValue`='5'"); 这是从PHP随机生成的,但我可以将其存储在一个变量中,并每n个循环运行一次 有什么

我需要运行一个PHP循环总共100000次(每个脚本运行大约10000次),每个循环大约有5个MySQL更新。当我运行循环50次时,需要3秒。当我运行循环1000次时,大约需要1300秒。正如您所看到的,MySQL的速度随着更新的增加而减慢了很多

这是一个示例更新:

mysql_query("UPDATE table SET `row1`=`row1` +1 WHERE `UniqueValue`='5'");
这是从PHP随机生成的,但我可以将其存储在一个变量中,并每n个循环运行一次

有什么方法可以使MySQL和PHP以一致的速度运行(PHP是否存储隐藏变量?),或者将脚本拆分,让它们这样做


注意:我运行此操作是为了开发目的,而不是为了生产,因此只有一台计算机访问数据。

关闭自动提交,并在N次后显式提交事务(如果使用InnoDB表)。它们的两个主要优点之一是重复查询效率更高。

除了索引
row1
UniqueValue
字段外,还要确保它们使用类似
INTEGER
的数字数据类型,并从
WHERE
子句中的
UniqueValue
中删除这些单引号

mysql_query("UPDATE table SET `row1`=`row1` +1 WHERE `UniqueValue`=5");

否则MySQL将需要在字符串之间来回传递它,这是一种性能成本。

使用类似于这样的方法应该可以更快地加载:

mysql_query("UPDATE table SET `row1`=`row1` + 1 WHERE `UniqueValue` IN (5, ... 10)");
假设你们有一个关于唯一值的索引。您可以使用默认设置创建高达8MB的查询,但1MB应该已经足够了。这将是一个巨大的查询,但要快得多

您还可以暂时完全禁用索引更新,这也会让事情变得更快:

ALTER TABLE table DISABLE KEYS;
ALTER TABLE table ENABLE KEYS;

您正在运行的数据库类型是什么?MyISAM还是InnoDB?如果您使用的是InnoDB,那么您使用的是事务吗?其他查询是什么?我很好奇是否可以将它们结合起来。在一个循环中查询数千次通常是个坏主意。合并您的查询。性能将显著提高。几乎有数千个相同的查询,只是不同的行和不同的uniquevalue。您可以在
update
语句中指定要更新的多个列,并使用其他运算符(例如
IN
BETWEEN…和
)指定多个uniquevalue。出于同样的原因,我仍然对具体的问题感到好奇。如果一个循环中只有5个简单查询,那么代码就不多了。展示给我们看。谢谢,我认为这对我们帮助最大!