我正在编写一个PHP脚本来从网络上抓取数据。最终结果,我想将所有抓取的数据很好地隐藏在 mysql 数据库中并进行格式化。
但是由于在 PHP 脚本中有多个循环和数组需要迭代,我的直觉是,为了速度和效率,最好不要保持对 mysql 数据库的循环访问(在循环的每次循环中插入数据)——相反,将数据存储在 PHP 中的临时数组中,然后只在脚本的末尾, 一次性将数组转储到 MySQL 中。
你们说什么?
您可以使用
插入到值("1","2","3"),("3","5,"5")
在Foreach中,您可以创建一个值数组,并且在forloop之外,您可以内爆并插入到MySQL中。
比方说,
$values = array();
foreach($yourData as $eachData){
// prepare your values here.
$values[] = "('1','2',3')";
}
// out of forloop,
$values = implode(",",$values);
$query = " insert into `tablename` (field1,field2,field2) values {$values} " ;
干杯
是的,在查询数量方面通常最小是高性能的。但是,您的脚本受网络io(下载速度)的限制,而不是数据库。当操作系统下载数据时,您的脚本大部分时间都处于睡眠状态。因此,您发出的任何查询都相对较少。
我的建议是让它工作。
如前所述,您可以使用一个查询插入多行,这比对每行使用单独的查询要优化得多。您可以使用循环向查询字符串添加更多行,但最重要的是,请记住转义数据!
<?php
$rows = array();
$sql = '
INSERT INTO `table` (`key`, `data`)
VALUES ';
$data = array(
array(
'key' => 'key1',
'value' => 'some value'
),
array(
'key' => 'key2',
'value' => 'some value 2'
),
array(
'key' => 'key3',
'value' => 'some value 3'
),
);
for ($i = 0; $i < count($data); ++$i)
{
// Do me a favor and look up PDO.
$key = mysql_escape_string($data[$i]['key']);
$row = mysql_escape_string($data[$i]['value']);
if ($i === 0)
$sql .= ' (''' . $key . ''', ''' . $row . ''')';
else
$sql .= ', (''' . $key . ''', ''' . $row . ''')';
}