0

我在编写 PHP 脚本时遇到了以下问题。我需要将变量长度数组中的前两个整数存储到数据库表中,删除它们并重复此操作,直到数组为空。我可以用 while 循环来做到这一点,但我读到你应该避免在循环中编写 SQL 语句,因为性能会受到影响。

一个简化的例子:

while(count($array) > 0){
if ($sql = $db_connect->prepare("INSERT INTO table (number1, number2) VALUES (?,?)")){
                        $sql->bind_param('ii',$array[0],$array[1]);
                        $sql->execute();
                        $sql->close();
                    }
                        array_shift($array);
                        array_shift($array);
}

这是最好的方法吗?如果不是,还有什么更好的方法?

4

5 回答 5

1

你可以做这样的事情,这也更快:

伪代码:

$stack = array();
while(count($array) > 0){
    array_push($stack, "(" . $array[0] . ", " . $array[1] . ")");
    array_shift($array);
    array_shift($array);
}
if ($sql = $db_connect->prepare("INSERT INTO table (number1, number2) 
                                 VALUES " . implode(',', $stack))){
    $sql->execute();
    $sql->close();
}

这里唯一的问题是它不是“MySQL Safe”插入,您需要修复它!

这将生成保存值的 Array。在 1 个查询中,它将一次插入所有值,您需要更少的 MySQL 时间。

于 2013-05-03T17:46:56.933 回答
0

你最好写一个批量插入语句,减少对 mysql 的访问

$sql = "INSERT INTO table(number1, number2) VALUES";
$params = array();
foreach( $array as $item ) { 
    $sql .= "(?,?),\n";
    $params[] = $item;
}
$sql = rtrim( $sql, ",\n" ) . ';';
$sql = $db_connect->prepare( $sql );
foreach( $params as $param ) {
    $sql->bind_param( 'ii', $param[ 0 ], $param[ 1 ] );
}
$sql->execute();
$sql->close();
于 2013-05-03T17:44:31.083 回答
0

根据我的经验,无论您是逐个运行它们还是在数组中运行它们,INSERT 语句都不会对性能造成明显影响。

数据库连接只打开一次,所以这不是一个大问题。我想如果你正在做一些疯狂的查询,它可能是。

于 2013-05-03T17:44:37.553 回答
0

我认为只要你的循环条件是安全的(会及时中断)并且你从中得到一些东西..没关系

于 2013-05-03T17:44:50.757 回答
0

在 ColdFusion 中,您可以将循环放在查询中,而不是相反。我不是 php 程序员,但我普遍认为,大多数可以用语言 a 完成的事情也可以用语言 b 完成。这段代码显示了这个概念。您应该能够找出一个php版本。

<cfquery>
insert into mytable
(field1, field2)
select null, null
from SomeSmallTable
where 1=2
<cfloop from="1' to="#arrayLen(myArray)#" index="i">
select <cfqueryparam value="myArray[i][1]
, <cfqueryparam value="myArray[i][]
from SomeSmallTable
</cfloop>
</cfquery>

当我自己查看这种方法时,我发现它比使用 oracle 和 sql server 在循环内查询要快。我发现使用红砖会慢一些。

这种方法有一个局限性。Sql server 有一个它可以接受的最大参数数量和一个最大查询长度。其他数据库引擎也可以,我还没有发现它们。

于 2013-05-03T18:00:04.303 回答