背景
我基本上有一个数组,
此数组具有以下格式
Array ( [0] => Array ( [co_id] => 1 [co_fname] => First [co_lname] => Last [co_company] => Company [co_address] => Address [co_ddi] => ddinumber [co_mobile] => mobilenumber [co_fax] => [co_email] => email@example.com [co_usms] => 1 [co_ufax] => 0 [co_uemail] => 1 [a_id] => 3 ) )
我正在遍历这个数组,并创建了一些插入语句。
有三个表,Message_email,Message_fax,Message_sms。
如果联系人的co_u(短信/传真/电子邮件)为1,我将联系人ID和相应的联系信息(co_mobile / co_fax / co_email)添加到其各自的阵列($ mobile / $ fax / $ sms)。
然后将数组的信息添加到表中。
<小时/>的问题
这些数组可能会变得非常大(想想200k +联系人)。
我应该。
a)创建一个批量插入语句 b)创建几个较小的批量插入语句 c)为每个联系人做一个插入声明。
速度很好但不是很重要。 可靠性是最重要的。
马特
答案 0 :(得分:0)
批量插入是一个好主意,因为与逐个插入相比,查询缓存变得更少了
答案 1 :(得分:0)
我通常根据SQL查询的长度进行批处理。我将构建查询,每次追加,直到达到一些简单的长度(10000个字符是一个很好的长度),然后将其刷新到服务器:
$query = 'INSERT INTO FOO (values) VALUES ';
$separator = '';
$values = '';
foreach ($rows as $row) {
$values .= $separator . '('.$row.')';
$separator = ', ';
if (strlen($values) >= 10000) {
query($query . $values);
$values = '';
$separator = '';
}
}
if (!empty($values)) query($query . $values);
这很好,因为它可以补偿小插入(int, int)
和巨大的(int, text, text)
...而且,您不会冒太长的风险并超时连接(或阻止其他用户)太长)。使用我的数据集,10k字符似乎是一个甜蜜点。由于MAX_PACKET通常为1mb,因此您可能会高达750k左右,并且仍然有足够的错误空间(取决于您的数据集)。但我宁愿使用一堆较小的批次而不是一个较大的批次......