1

我有两个版本的代码来做同样的事情。一个使用准备好的语句,另一个使用连接的字符串。我的理解是准备好的语句应该会导致性能提高,但是在设置 $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);         
     }
 }
4

3 回答 3

1

我会使用某种时间功能来确定您的交易的确切速度。

如:

$time = -microtime(true);
// run transactions
$time += microtime(true);
echo $time . ' in seconds to process...';

此外,准备好的语句不一定是为了提高性能而创建的。如果有的话,我会假设他们会减慢速度。准备好的陈述是为了“准备”陈述。这意味着他们处理文本,引用任何参数以防止 SQL 注入,并确保 SQL 语句没有任何语法错误。该开销不会提供性能提升。

于 2013-09-06T18:18:45.350 回答
0

因为这是一个神话。

事实上,这样的“性能提升”只是一个不经意间将用户引诱到准备好的语句手中的童话故事。

然而

133 秒对于 10000次插入来说太长了。它应该慢了近 10000 倍。

它是具有默认设置的 innodb 引擎,可以减慢您的插入速度。您可以更改设置,或者 - 正如您被告知的那样 - 将您的插入包装到单个事务中。您将在几分之一秒内完成所有插入。

于 2013-09-06T19:35:48.167 回答
-1

提前准备报表并没有导致性能大幅提升,因为性能提升主要来自网络旅行时间。由于我的数据库存储在执行我的脚本的同一台机器上,因此准备好的语句几乎没有性能优势。

但是,当使用单个查询插入多个值时,我看到性能提高了 100 倍以上。这是解决我的性能问题的更好方法。

见:http ://www.electrictoolbox.com/mysql-insert-multiple-records/

于 2013-09-08T12:02:32.590 回答