前言:从刚开始做这个功能时候就一直很诟病,因为涉及到从sqlsr,oricle中去取值并且,入库到mysql,刚开始由于时间的紧迫所以就用时间换控制生成数据,但是后面确实看不惯这么慢的生成数据的时间,所以动刀子优化。
1.前期的是调用某个同事封装的方法,批量插入数据库,好像是
insert into xxx;
insert into xxx;
以这样的形式foreach入库,这种入库方法是非常低效的而且非常慢。
2.中期实现优化的第一轮以这种
$val = sprintf("%s,'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%f','%s','%s','%s','%s','%f','%f','%f','%s','%s','%s','%s','%s','%s','%s'", 'uuid()',$it_dt['id_assets'],$it_dt['license_num'],$it_dt['assets_num'],$it_dt['cars_brand'],$it_dt['car_model'],$it_dt['asset_make_num'],$it_dt['supplier'],$it_dt['engine'],$it_dt['power'],$it_dt['new_flag'],$it_dt['mon_rent'],$it_dt['car_location'],$it_dt['new_financing_type'],$it_dt['financing_type'],$it_dt['purchase_date'],$localoriginvalue_i,$depamount_new_i,$net_residual_money_i,$dt_time,'平均年限法',$status,$year_m,$id_org,$asset_name,$it_dt['bus_type']);
拼接一个长sql完成,这种拼接是很快但是咧组装数据那是灾难性,非常麻烦。
这种的模式是insert into xxx () values(),values().....这种形式
3.后期优化最后实现
//其中restable是一个数据库,表的数组
//$columns是一个字段=>值形式的二维数组
function quick_insert($restable,$columns){
$sql_log = "insert into {$restable['db_name']}.{$restable['tbl_name']}";//定义长字符串
$sql_key = '';//定义字段值变量
$sql_value = '';//定义值字段对应值变量
foreach ($columns as $key=>$row){
if($key == 0){
//得到key值作为字段值,
$sql_key = "(`".implode("`, `", array_keys($row))."`) VALUES";
}
//得到value值
$sql_value .= "( '".implode("', '", array_values($row))."'),";
}
//拼接结果
$sql_l = <<<SQLL
{$sql_log} {$sql_key} {$sql_value}
SQLL;
//把最后一个的逗号换成
$sql_l = rtrim($sql_l, ',');
$sql_l .= ';';
return $sql_l;
}
最后:从这个代码优化提示了好几十倍从原来的4分钟变成20秒,而且组装数据也不会那么困难,代码还可以优化只是几万的数据插入就差不多,到此结束
网友评论