随笔背景
项目需要读取一个文件(大约2w~10w行),将每一行处理后存储在mysql数据库中。
但是插入操作执行非常慢(大约每秒20条)
原始代码
while(!feof($f)){
$text=fgetcsv($f);
if($text!=array()){
$content=array(
//略
};
$this->db->insert('`'.$table_name.'`',$content);
}
}
解决方法
利用数据库事务处理
MySQL 事务主要用于处理操作量大,复杂度高的数据。
1、在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
2、事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
3、事务用来管理 insert,update,delete 语句
使用事务处理将多条insert包装成一个事务,同一处理。
优化代码
$i=0;
$this->db->query('BEGIN');
while(!feof($f)){
$text=fgetcsv($f);
if($text!=array()){
$content=array(
//略
);
$this->db->insert('`'.$table_name.'`',$content);
}
$i++;
if($i%3000==0){
$this->db->query('COMMIT');
$this->db->query('BEGIN');
}
}
$this->db->query('COMMIT');
最终处理2w条数据只用了4秒,巨大成功。