登录

PHP实现插入100万条数据优化

PHP笔记
1 820
 

第一种方法一条一条执行插入,结果会很慢

connect_error) {
 die("connect failed: " . $conn->connect_error);
} 

// 第一种,一条一条插入,结果要2分多钟
$costBegin = time();
echo date('Y-m-d H:s:i'$costBegin)."
"; for($i=0;$i<1000000;$i++){ $sql = sprintf("INSERT INTO charu (name age) VALUES ( '%s' %d);" '测试' 10); $conn->query($sql); } $costEnd = time(); echo date('Y-m-d H:s:i'$costEnd)."
"; $cost = $costEnd - $costBegin; echo date('Y-m-d H:s:i'$cost)."
"; $conn->close();
 

第二种使用insert合并插入

mysql里面是可以使用insert语句进行合并插入的,比如

INSERT INTO charu (name age) VALUES ('name1' 18) ('name2' 19);

表示一次插入两条数据

 

connect_error) {
 die("connect failed: " . $conn->connect_error);
} 

// 第二种,把所有要插入的数据生成为一条sql语句,所以执行的时间会快很多,测试时间是5秒多,服务器配置不同会影响时间
$costBegin = time();
echo date('Y-m-d H:s:i'$costBegin)."
"; $sql = sprintf("INSERT INTO charu (name age) VALUES "); for($i=0;$i<1000000;$i++){ $itemStr = '( '; $itemStr .= sprintf("'%s' %d" '测试' 10); $itemStr .= ')'; $sql .= $itemStr; } // 去除最后一个逗号,并且加上结束分号 $sql = rtrim($sql ''); $sql .= ';'; if ($conn->query($sql) === TRUE) { echo "新记录插入成功". "
"; } else { echo "Error: " . $sql . "
" . $conn->error; } $costEnd = time(); echo date('Y-m-d H:s:i'$costEnd)."
"; $cost = $costEnd - $costBegin; echo date('Y-m-d H:s:i'$cost)."
"; $conn->close();

使用第二种方法有可能会出现

MySQL server has gone away错误的解决办法

而我自己是直接在my.ini文件里面直接添加(max_allowed_packet = 30M)然后重启环境就可以了

原文地址 : https://www.cnblogs.com/lcxin/p/11527565.html

发表评论

1 个回复