我何时应该在PHP中取消设置以提高性能

时间:2016-06-29 06:29:53

标签: php mysql performance mysqli unset

我使用以下代码:

for ($x = 0; $x < count($response[0]); $x++) { //approx count 50-60

    $t = $response[0][$x];
    $query = "INSERT INTO tableX (time,title) VALUES ('$date','$t')";

    if ($query_run = mysqli_query($mysql_connect, $query)) {

    //Call some functions if the insertion happens

    }
}

mysqli_close($mysql_connect);

表中的标题是一个pimary键。我将仅在插入成功时调用某些函数,即,不提供现有标题。标题和日期来自csv文件。

如何提高此代码的性能?我应该何时使用unset来节省CPU内存周期?

3 个答案:

答案 0 :(得分:3)

unset不会通过任何有意义的指标来提高效果。

提高性能的是每个查询更新多行。

我们以您的代码为例。这只是它的一个例子。如果您需要在插入后运行其他函数,那么您可能希望一次更新例如10行或100行而不是所有行。

$query = "INSERT INTO tableX (time,title) VALUES ";
$valueQuery = array();

for ($x = 0; $x < count($response[0]); $x++) { //approx count 50-60
    $t = $response[0][$x];
    $valueQuery[] =  "('$date','$t')";
}
$query .= implode(", ",$valueQuery);

if ($query_run = mysqli_query($mysql_connect, $query)) {
    //Call some functions if the insertion happens
}

答案 1 :(得分:2)

这个问题完全基于错误的前提。

首先,无处使用unset将为您节省CPU周期,但宁愿使用它们。

此外,无论如何都没有多少地方可以解开。

最后,此代码的性能没有真正的问题。如果您遇到任何问题,您应该对它们进行检测,找出真正的瓶颈,然后修复它,而不是在随机的树上吠叫。

您的实际问题应该是,您的代码对sql注入和各种语法错误都是开放的,而不是虚构的性能问题。

答案 2 :(得分:1)

您可以通过为insert(1)使用预准备语句来改进显示的代码。实际上,在每次迭代中,您首先必须定义$ query然后执行。在每次执行时,数据库还必须首先解析您的语句。

通过在进入循环之前准备语句,您只需定义一次,并且可以使用不同的值执行它。此语句只有在准备好时才会被解析,并且在每次执行时都不会被解析。

这是一个关于php中垃圾收集器如何工作的小工具:http://www.hackingwithphp.com/18/1/10,在这个问题中找到:Is there garbage collection in PHP?

  

PHP在三个主要时刻执行垃圾收集:

When you tell it to

When you leave a function

When the script ends

所以也许您应该检查一下您可以将多少程序封装到函数中,尽管在您的代码段中没有太多内容。

(1)

我建议准备好的陈述以提高效率。减少工作负载是最佳实践 - 不必要的解析查询。

所以我对实际的性能改进没有任何估计,尽管这个案例谈论的是50到60次迭代,即使是显而易见的也会很少。