【发布时间】:2014-11-24 17:12:23
【问题描述】:
我通常不会在 PHP 中使用很多 SQL 的东西,但最近被朋友强迫使用它来帮助他调试一些东西。
我正在使用 PDO 和 PHP 来插入一些数据,但插入性能很糟糕。一个简单的 151 次插入循环需要将近 6 秒!我不知道为什么。
这是我的代码:
<?php
$database='XXXXXX';
$username='XXXXXX';
$password='XXXXXX';
$hostname='127.0.0.1';
$inserted=0;
$counted=0;
$dsn = 'mysql:dbname='.$database.';host='.$hostname.'';
$start=microtime(true);
try {
$data = new PDO($dsn, $username, $password, array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
echo('Connection failed: ' . $e->getMessage());
}
for($i=1;$i<=150;$i++) {
$time=time();
$query=$data->prepare("INSERT INTO `tbl_temp` (aid, bid) VALUES (?, ?)");
$query->execute(array($i, $time));
}
$data=null;
print "Took: ".(microtime(true)-$start)." S to insert $i records\n";
// Took: 5.569482088089 S to insert 151 records <--- result
?>
我也尝试过使用 bindParam 的相同代码,速度大致相同。该服务器具有 8 核 Xeon 处理器和 64gb 内存。该脚本正在从命令行(php-cgi)运行,并且数据库和表是新的并且是空的。数据库类型是 InnoDB。谁能指出我在哪里寻找它为什么这么慢的正确方向?因为我确信 MySQL 从来没有这么慢过!
【问题讨论】:
-
在循环外准备 sql 会有所帮助。我认为问题更可能出在您的表结构中。您的表格结构和当前内容是什么?
-
嗨。我的结构是这样的...
codeid -> AI Primary Key,aid -> Int, bid -> Int 我当前的内容是零行就是这样:) -
只是一个建议,对上述查询进行解释并观察它的瓶颈所在。可能有用还是没用......
-
@ThinkingWeb。没有用,我已经试过了。插入查询真的没有比这更简单的了。此外,这与您放置的链接的可能副本相去甚远,因此我不确定您为什么将其放在那里。
标签: php mysql pdo prepared-statement innodb