mysqli类提供了多种不同的插入方法,每种方法都有其自身的优点。毫无疑问,其中一种方法应该符合您的需求。
以下示例假定您未指定的“提取数据”存储在一个数组的数组中:$bigArray [0 ... datasetsize] [0 ... 2]。
假设mysqli数据库为$db。
方法1-尽可能简单
如果您想使用准备好的语句和参数绑定,则首次尝试可能如下所示。虽然不是最佳选择,但语句仅准备一次。但是,变量会为每个插入绑定,这是浪费资源的(但简单)。由于插入未捆绑,因此示例循环10次。
$statement = $db->prepare("INSERT INTO testTable (fieldA, fieldB, fieldC) VALUES (?,?,?)");
for ($i = 0; $i < 10; ++$i)
{
$statement->bind_param("iii",$bigArray[$i][0],$bigArray[$i][1],$bigArray[$i][2]);
$statement->execute();
}
方法2 - 优化
使用预处理语句和多个插入的结合,可以实现性能几乎与方法1中的原始插入查询相同。实际结果将根据您的设置而异,但在我的系统上进行快速测试(包括本地和远程数据库),使用优化的方法比方法1的数据需要转义时性能略有提高了几个百分点。
以下示例使用call_user_func_array,但如果您知道要每次捆绑多少个插入并直接构建bind_param,则可以避免该函数调用,这会进一步略微提高性能。
$sql = "INSERT INTO testTable (fieldA,fieldB,fieldC) VALUES (?,?,?)".str_repeat(",(?,?,?)",count($bigArray)-1);
$statement = $db->prepare($sql);
$types = str_repeat("s", count($bigArray) * count($bigArray[0]));
$values = array_merge(...$bigArray);
$statement->bind_param($types, ...$values);
$statement->execute();