0

我想插入数千条记录,我需要这个速度很快。我阅读了很多关于这个问题的信息,所以我决定放弃我的旧方法(mysql_connect)并使用准备语句和 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 秒。所以我很困惑。我能做些什么?使用加载数据?

4

1 回答 1

2

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

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

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

在 PHP 中,如果在循环中重复足够多次,单个函数调用的开销可能会很明显。有人告诉我,这两种说法之间存在可衡量的差异:

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

第二行是函数调用,因此速度较慢(尽管幅度很小)。

于 2012-10-29T17:46:40.353 回答