在mysql中插入千条记录的最快方法是什么?

时间:2012-10-29 17:36:30

标签: mysql performance mysqli

我想插入数千条记录,我需要快速。我读了很多关于这个问题的内容,所以我决定放弃我的旧方法(mysql_connect)并使用prepare语句和mysqli。所以为了测试这个的速度,我写下面的内容。

function load_data2db($sms_id){
$mysqli = new mysqli('localhost', 'root', 'cr3at1ve', 'tmp-clicknsend');
/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}


// Create statement object
$stmt = $mysqli->stmt_init();
if ($stmt = $mysqli->prepare("INSERT INTO isec_test (sms_id, status,msgid,prmsgid,mob,sms_history_id) values (?, ?, ?, ?, ?, ?)")) {


        /* Bind our params */
        $stmt->bind_param('ssssss',$sms_id,$status,$msgid,$prmsgid,$mob,$sms_history_id);

    for($i=0;$i<100000;$i++)
    {
        /* Set our params */
        $sms_id = "110";
        $status = "OK";
        $msgid  = "msgid";
        $prmsgid = "100-0";
        $mob = "306974386068";
        $sms_history_id = 102;

        /* Execute the prepared Statement */
        $stmt->execute();
    }


        /* Close the statement */
        $stmt->close();
}
else {
        /* Error */
        printf("Prepared Statement Error: %s\n", $mysqli->error);
}
}

load_data2db(10);

然后我用旧方法做了同样的事情(逐个循环和插入)

include("mysql_connect.php");
 for($i=0;$i<100000;$i++)
    {
    $query = "INSERT INTO isec_test(sms_id,status,msgid) values ('1','OK','123-123')";
    $query = @mysql_query($query);
    }
mysql_close($dbc);

我做了很多测试,而且简单的mysql方式总是快1秒。所以我很困惑。我能做什么?使用LOAD DATA?

1 个答案:

答案 0 :(得分:2)

我建议您使用LOAD DATA LOCAL INFILE,除非您在插入时需要对每行进行一些处理。

通常建议在数据库端准备SQL语句和绑定参数更快,因为它不需要重新解析SQL查询数千次。

但PHP扩展本身包含一些需要在应用程序端运行的代码。 mysqli扩展可能更复杂,因此比旧的mysql扩展稍微更多的开销用于重复操作。

在PHP中,如果在循环中重复足够多次,单个函数调用的开销就会很明显。我让人们告诉我这两个陈述之间有一个可衡量的区别:

$x = (int) '123';
$x = intval('123');

第二行是一个函数调用,所以它的速度较慢(虽然幅度非常小)。