批量插入sql语句拼接效率优化(即长字符串大量循环拼接)

生成插入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变量来做字符串拼接的过渡作用, 减少长字符串的拼接次数

你可能感兴趣的:(批量插入sql语句拼接效率优化(即长字符串大量循环拼接))