我有两个版本的代码来做同样的事情。一个使用预准备语句,另一个使用串联字符串。我的理解是,预准备语句应该导致性能提高,但是在设置 $size=100(因此迭代 10000 个插入查询的代码)后,我无法检测到两种方法之间的任何性能差异。每个都在 appx 中运行。133秒。我是否正确地实现了预准备语句代码? 代码如下:
准备好的声明:
if ($stmt = $mysqli->prepare("INSERT INTO sectors (sector) VALUES (?)"))
{
for ($x = 0; $x < $size; ++$x)
{
for ($y = 0; $y < $size; ++$y)
{
$dirtysector = $x . "-" . $y;
$secstring = clean_sector($dirtysector);
$stmt->bind_param('s', $secstring);
$stmt->execute();
}
}
$stmt->close();
串联字符串:
for ($x = 0; $x < $size; ++$x)
{
for ($y = 0; $y < $size; ++$y)
{
$dirtysector = $x . "-" . $y;
$secstring = clean_sector($dirtysector);
$query = "INSERT INTO sectors " .
"(sector) VALUES " .
"('$secstring')";
$result = $mysqli->query($query);
if(!$result) die("Sector Creation Failed: " . $mysqli->error);
}
}
我会使用某种时间功能来确定交易的确切速度。
如:
$time = -microtime(true);
// run transactions
$time += microtime(true);
echo $time . ' in seconds to process...';
此外,创建预准备语句不一定是为了提高性能。如果有的话,我认为他们会放慢速度。准备好的陈述是"准备"陈述。这意味着他们处理文本,引用任何参数以防止SQL注入,并确保SQL语句没有任何语法错误。该开销不会提供性能提升。
因为这是一个神话。
事实上,这样的"性能提升"只是一个童话故事,不会引诱用户进入准备好的陈述手中。
然而
133 秒对于 10000 次插入来说太长了。比它应该慢近 10000 倍。
它是具有默认设置的innodb引擎,可以减慢您的插入速度。您可以更改设置,或者 - 正如您被告知的那样 - 将您的插入包装成单个事务。您将在几分之一秒内完成所有插入。
提前准备语句并没有导致性能的大幅提高,因为性能提升主要来自网络旅行时间。由于我的数据库存储在执行脚本的同一台计算机上,因此预准备语句几乎没有性能优势。
但是,当使用单个查询插入多个值时,我看到性能提高了 100 倍以上。这是解决我的性能问题的更好解决方案。
请参阅:http://www.electrictoolbox.com/mysql-insert-multiple-records/