mysql ::插入什么类型?

时间:2010-11-04 22:07:16

标签: php mysql

背景

我基本上有一个数组,

此数组具有以下格式

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)为每个联系人做一个插入声明。

速度很好但不是很重要。 可靠性是最重要的。

马特

2 个答案:

答案 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左右,并且仍然有足够的错误空间(取决于您的数据集)。但我宁愿使用一堆较小的批次而不是一个较大的批次......