Laravel-Excel 2、插入数据更快
Laravel-Excel 2, Insert data faster
这是我用来将 excel(使用 Maatwebsite Laravel-Excel 2)文件导入我的数据库的方法的主要代码:
$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
foreach ($data as $key => $value) {
$med= trim($value["med"]);
$serial = trim($value["nro.seriemedidor"]);
DB::table('medidores')->insert([
"med" => $med,
"serial_number" => $serial
]);
}
DB::commit();
} catch (\Exception $e) {
DB::rollback();
return redirect()->route('myroute')->withErrors("Some error message");
}
当我有 "few" 数据时(假设 excel 文件中少于 5000 行),这工作正常。但是我需要处理一个大的 excel 文件,它有大约 140 万行,分成超过 1 个 sheet。我怎样才能使我的方法更快?有什么建议吗?
编辑:我将使用答案评论之一 link 上的代码编辑问题:
$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
$bulk_data = [];
foreach ($data as $key => $value) {
$med= trim($value["med"]);
$serial = trim($value["nro.seriemedidor"]);
$bulk_data[] = ["med" => $med,"serial_number" => $serial] ;
}
$collection = collect($bulk_data); //turn data into collection
$chunks = $collection->chunk(100); //split into chunk of 100's
$chunks->toArray(); //convert chunk to array
//loop through chunks:
foreach($chunks as $chunk)
{
DB::table('medidores')->insert($chunk->toArray());
}
DB::commit();
} catch (\Exception $e) {
DB::rollback();
return redirect()->route('myroute')->withErrors("Some error message");
}
大块的东西对我有用。
是的,你可以,而不是执行 X(数据库请求数)* N(工作表数)尝试做一个简单的批量插入,这只会花费你循环数据保存 X * N 数据库请求的复杂性,这是一个例子:
$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
$bulk_data = [];
foreach ($data as $key => $value) {
$med= trim($value["med"]);
$serial = trim($value["nro.seriemedidor"]);
$bulk_data[] = ["med" => $med,"serial_number" => $serial] ;
}
DB::table('medidores')->insert($bulk_data);
DB::commit();
} catch (\Exception $e) {
DB::rollback();
return redirect()->route('myroute')->withErrors("Some error message");
}
关于数据库请求的更多解释,你可以参考这个答案:
这是我用来将 excel(使用 Maatwebsite Laravel-Excel 2)文件导入我的数据库的方法的主要代码:
$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
foreach ($data as $key => $value) {
$med= trim($value["med"]);
$serial = trim($value["nro.seriemedidor"]);
DB::table('medidores')->insert([
"med" => $med,
"serial_number" => $serial
]);
}
DB::commit();
} catch (\Exception $e) {
DB::rollback();
return redirect()->route('myroute')->withErrors("Some error message");
}
当我有 "few" 数据时(假设 excel 文件中少于 5000 行),这工作正常。但是我需要处理一个大的 excel 文件,它有大约 140 万行,分成超过 1 个 sheet。我怎样才能使我的方法更快?有什么建议吗?
编辑:我将使用答案评论之一 link 上的代码编辑问题:
$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
$bulk_data = [];
foreach ($data as $key => $value) {
$med= trim($value["med"]);
$serial = trim($value["nro.seriemedidor"]);
$bulk_data[] = ["med" => $med,"serial_number" => $serial] ;
}
$collection = collect($bulk_data); //turn data into collection
$chunks = $collection->chunk(100); //split into chunk of 100's
$chunks->toArray(); //convert chunk to array
//loop through chunks:
foreach($chunks as $chunk)
{
DB::table('medidores')->insert($chunk->toArray());
}
DB::commit();
} catch (\Exception $e) {
DB::rollback();
return redirect()->route('myroute')->withErrors("Some error message");
}
大块的东西对我有用。
是的,你可以,而不是执行 X(数据库请求数)* N(工作表数)尝试做一个简单的批量插入,这只会花费你循环数据保存 X * N 数据库请求的复杂性,这是一个例子:
$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
$bulk_data = [];
foreach ($data as $key => $value) {
$med= trim($value["med"]);
$serial = trim($value["nro.seriemedidor"]);
$bulk_data[] = ["med" => $med,"serial_number" => $serial] ;
}
DB::table('medidores')->insert($bulk_data);
DB::commit();
} catch (\Exception $e) {
DB::rollback();
return redirect()->route('myroute')->withErrors("Some error message");
}
关于数据库请求的更多解释,你可以参考这个答案: