MySQL批量插入数据库的几种方法实现
- 这里介绍几种批量导入数据库的方法,并介绍一下各自性能优缺点,以下代码是用tp5实现的。
- 首先批量导入一般会涉及到服务器超时的问题,可以修改php.ini文件的 max_execution_time 参数。
- 方法一:循环单个插入,这种方法数据量大时会很慢,一般不推荐使用。
public function batch_insert_data()
{
for ($i = 0; $i <= 200000; $i++) {
$param['name'] = 'name' . $i;
$param['tel'] = $i;
$insert = Db::table('user')->insert($param);
}
return json(['code' => 200, 'msg' => '成功']);
}
- 方法二:批量循环插入,这种方法数量大时一般会提示MySQL server has gone away错误,这是因为数据库限制了数据包大小。下面的语句第一句是查看大小,第二句是修改大小。执行过程中如果出现内存耗尽的情况,可以修改php.ini文件中的memory_limit参数。
show global variables like 'max_allowed_packet';
set global max_allowed_packet = 64 * 1024 *1024;
- 这种方法速度快,但是存在一定的安全问题,如果对数据要求不是特别高的时候可以使用。
- 数据量特别大时也可以分批次插入。
public function batch_insert_data_multiple()
{
$add_param = [];
for ($i = 0; $i <= 200000; $i++) {
$param['name'] = 'name' . $i;
$param['tel'] = $i;
array_push($add_param, $param);
}
$insert = Db::table('user')->insertAll($add_param);
return json(['code' => 200, 'msg' => '成功']);
}
public function affair_insert_data()
{
Db::startTrans();
try{
for($i = 0; $i <= 200000; $i++){
$param['name'] = 'name'.$i;
$param['tel'] = $i;
$insert = Db::table('user')->insert($param);
}
Db::commit();
}catch(\Exception $e){
Db::rollback();
}
return json(['code' => 200, 'msg' => '成功']);
}
- 方法四:当数据量达到一定程度时,需要按批次来上传,并结合事务使用。
public function affair_insert_data_two()
{
Db::startTrans();
try{
for ($i = 0; $i <= 200000; $i++) {
$param['name'] = 'name' . $i;
$param['tel'] = $i;
try {
$insert = Db::table('user')->insert($param);
if ($i % 100000 == 0) {
Db::commit();
}
} catch (\Exception $e) {
Db::rollback();
}
}
Db::commit();
}catch(\Exception $e){
Db::rollback();
}
return json(['code' => 200, 'msg' => '成功']);
}
- 在实际应用中,方法三、四用的比较多,结合事务,分批次上传数据。单论速度来说,方法二的速度最快。方法一不推荐使用。