我想插入数千条记录,我需要快速。我读了很多关于这个问题的内容,所以我决定放弃我的旧方法(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?
答案 0 :(得分:2)
我建议您使用LOAD DATA LOCAL INFILE
,除非您在插入时需要对每行进行一些处理。
通常建议在数据库端准备SQL语句和绑定参数更快,因为它不需要重新解析SQL查询数千次。
但PHP扩展本身包含一些需要在应用程序端运行的代码。 mysqli扩展可能更复杂,因此比旧的mysql扩展稍微更多的开销用于重复操作。
在PHP中,如果在循环中重复足够多次,单个函数调用的开销就会很明显。我让人们告诉我这两个陈述之间有一个可衡量的区别:
$x = (int) '123';
$x = intval('123');
第二行是一个函数调用,所以它的速度较慢(虽然幅度非常小)。