我使用以下代码:
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内存周期?
答案 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次迭代,即使是显而易见的也会很少。