3

以下 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

编辑:表结构:

CREATE TABLE IF NOT EXISTS `accounts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `email` varchar(200) NOT NULL,
  `password` varchar(20) NOT NULL,
  `status` varchar(10) DEFAULT 'pending',
  `email_newsletter_status` varchar(3) DEFAULT 'out',
  `email_type` varchar(4) DEFAULT 'text',
  `email_favorite_artists_status` varchar(3) DEFAULT 'out',
  `created_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7500 ;

这段代码只是为了测试插入速度。使用 Zend 框架(Zend_Db 的插入方法)我得到了类似的结果,所以我认为它与 mysql 相关而不是 php 代码

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

4

4 回答 4

8

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");
于 2012-08-15T20:48:30.200 回答
6

与其运行多个插入语句,不如将它们批处理并作为一个语句执行

 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');

这将大大加快您的插入速度

于 2012-08-15T20:48:43.850 回答
2

如果你使用股票,my.cnf你的表现可能会很糟糕。您可能想查看您的 MySQL 是如何配置的并相应地调整参数。调优 InnoDB 是更好的引擎,需要调整与 MyISAM 不同的值,MyISAM 通常是快速但不安全的默认值。

如果这些查询需要大量时间来执行,请尝试使用 MySQL 管理员工具查看或SHOW PROCESSLIST频繁执行以查看引擎在做什么。

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

于 2012-08-15T20:54:43.870 回答
0

尝试单个插入查询:

$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");
}

此外,您应该停止使用mysql_*函数。它们正在被弃用。而是使用PDO(从 PHP 5.1 开始支持)或mysqli(从 PHP 4.1 开始支持)。如果您不确定要使用哪一个,请阅读这篇文章

于 2012-08-15T20:51:02.047 回答