Php 22秒是在mysql中插入500行的好时间吗?

Php 22秒是在mysql中插入500行的好时间吗?,php,mysql,Php,Mysql,下面的php脚本执行大约需要22秒。这正常吗?如果不是,是什么导致它执行缓慢 $conn = mysql_connect('localhost', 'root', '123'); mysql_select_db('mydb', $conn); $time1 = time(); for ($i=1;$i<500;$i++) { mysql_query("Insert into accounts(id, username, email, password) VALUES(\"$i\", \"$

下面的php脚本执行大约需要22秒。这正常吗?如果不是,是什么导致它执行缓慢

$conn = mysql_connect('localhost', 'root', '123');
mysql_select_db('mydb', $conn);
$time1 = time();
for ($i=1;$i<500;$i++) {
mysql_query("Insert into accounts(id, username, email, password) VALUES(\"$i\", \"$i\",\"$i\",NOW())");
}
print time() - $time1; // return ~22
此代码仅用于测试插入速度。使用Zend框架(Zend_Db的insert方法)我得到了类似的结果,因此我认为它与mysql相关,而与php代码无关


Edit2:我知道有更好的方法来执行这个查询,但我想知道为什么这个查询这么慢。

22秒是很长的时间。我猜在每次插入之后,索引都需要更新

尝试将此作为事务处理

mysql_query("START TRANSACTION");
for ($i=1;$i<500;$i++) {
    mysql_query("Insert into accounts(id, username, email, password) VALUES(\"$i\", \"$i\",\"$i\",NOW())");
}
mysql_query("COMMIT");
mysql_查询(“启动事务”);

对于($i=1;$i),不要运行多个insert语句,而是将它们批处理并作为一个语句执行

 INSERT INTO example
  (example_id, name, value, other_value)
VALUES
  (100, 'Name 1', 'Value 1', 'Other 1'),
  (101, 'Name 2', 'Value 2', 'Other 2'),
  (102, 'Name 3', 'Value 3', 'Other 3'),
  (103, 'Name 4', 'Value 4', 'Other 4');

这将大大加快插入速度

尝试单个插入查询:

$valStr = "";
for ($i=1;$i<500;$i++) {
    $valStr = $valStr . ($valStr == "" ? "" : ", ") . "('$i', '$i', '$i', NOW())";
}
if ($valStr != "") {
    mysql_query("Insert into accounts(id, username, email, password) VALUES $valStr");
}
$valStr=”“;

对于($i=1;$i如果您使用的是股票
my.cnf
,您的性能可能会很糟糕。您可能需要查看MySQL的配置并相应地调整参数。优化InnoDB这一更好的引擎需要调整不同于MyISAM的值,MyISAM通常是快速但不安全的默认值

如果执行这些查询需要相当长的时间,请尝试使用MySQL管理员工具查看,或者经常执行
SHOW PROCESSLIST
,以查看引擎正在做什么


通过MySQL驱动程序直接插入500条记录,在这样一个简单的表上最多只需要几秒钟。

取决于很多因素。你的表有索引吗?它有外键约束吗?至于你真正的问题,22秒太慢了吗:你告诉我们。它对你的特定应用程序和用户群来说太慢了吗?不会吧在单个事务中执行所有插入操作可以加快速度?我不记得在mysql中是否会这样。您没有提供任何关于表结构或配置的信息。我们不知道为什么您的数据库运行缓慢。这可能无助于回答您的问题,但您应该停止使用
mysql.*
函数。它们已被弃用。请改用(从PHP5.1开始支持)或(从PHP4.1开始支持)。如果您不确定要使用哪一个,。为什么不将
值连接成一个字符串进行一次插入?@Matt:这也是个好主意。不过,我想我会给出另一个建议。@Matt:另外,我不知道一个查询中有500个值是否太多。我记得我在做一个项目,我不得不打断大的插入因为我在尝试运行SQL时不断出错。如果服务器错误地配置了非常小的
max\u allowed\u packet
设置,它将拒绝“太长”的查询。一个正确配置的服务器将允许最小1MB,更宽泛的限制是1GB。您可以通过在
SHOW VARIABLES
中查找来检查这是什么。谢谢,您的解决方案将执行时间减少到1秒以下,但我的代码实际上需要20秒才能执行吗?中的
mysql\u查询有什么用你的例子?我以为你是在反对团队。当我看到所有这些危险的SQL被复制粘贴时,我只是哭了一下,好像这是一件很酷的事情。在这个例子中,最好使用
UUID()之类的东西来避免字符串替换
用于占位符数据。@tadman我只是想根据他提供的代码,在OP中找到一个有效的快速替代解决方案。我知道这一点……我想知道为什么我的代码要花这么多时间执行
$valStr = "";
for ($i=1;$i<500;$i++) {
    $valStr = $valStr . ($valStr == "" ? "" : ", ") . "('$i', '$i', '$i', NOW())";
}
if ($valStr != "") {
    mysql_query("Insert into accounts(id, username, email, password) VALUES $valStr");
}