生成插入10000条的sql语句,字符串拼接需要20s?
使用一下方法生成批量插入sql语句:
public function buildINSERTQueryBatch($postarray, $table, $columns) {
$sql = 'INSERT INTO ' . $table . ' ( ';
foreach ( $columns as $colname ) {
$sql = $sql . $colname . ',';
}
$sql = substr ( $sql, 0, - 1 ) . ' ) values ';
foreach ($postarray as $arr) {
$sql = $sql . ' ( ';
foreach ( $columns as $colname ) {
$sql = $sql . "'" . $arr[$colname] . "',";
}
$sql = substr ( $sql, 0, - 1 ) . ' ),';
}
return substr ( $sql, 0, - 1 );
}
该方法执行时间: 12.332323232s左右 (colname字段数有一定影响)
经过多次测试发现, 批量插入的数据越多,
如: 插入5000条数据,生成sql语句的时间需要 4.3202469348907s
插入8000条数据,生成sql语句的时间需要 11.567662000656s
10000条数据, 生成sql语句的时间需要 23.851363897324
最终发现是因为原字符串sql太长的原因造成的, 如 A = A . B, A越长,消耗的时间越长
减少长字符串A 的拼接次数或减少A 的长度
改进方法:
public function buildINSERTQueryBatch($postarray, $table, $columns) {
$sql = 'INSERT INTO ' . $table . ' ( ';
foreach ( $columns as $colname ) {
$sql .= $colname . ',';
}
$sql = rtrim( $sql, ',') . ' ) values ';
$data = '';
foreach ($postarray as $key=>$arr) {
$data .= ' ( ';
foreach ( $columns as $colname ) {
$data .= "'" . $arr[$colname] . "',";
}
$data = rtrim( $data, ',') . ' ),';
if($key%500 == 0){
$sql .= $data;
$data = '';
}
}
if($data == ''){
$sql = rtrim( $sql, ',');
}else{
$data = rtrim( $data, ',');
}
return $sql . $data;
}
以上部分优化可以忽略, 主要是引入$data变量来做字符串拼接的过渡作用, 减少长字符串的拼接次数