Excel导入大量(百万条)数据在入库如何节流?
1. 运行环境
1). 当前使用的 Laravel 版本?
Laravel 版本:8.83.26
2). 当前使用的 php 版本?
PHP 版本:8.1.3
2. 问题描述?
当数据量增大时,节流新增问题
目前是进行sql组装然后直接入库,该如何节流?有什么方案推荐吗?
if (count($rows) > 1) {
unset($rows[0]);
$sql = "INSERT INTO k_admins (`uuid`,`nickname`, `parent_id`, `title`, `gender`, `mobile`, `password`) VALUES ";
foreach ($rows as $row) {
$gender = $row[3] == '男' ? 1 : 2;
$password = Hash::make($row[5]);
$sql.='("'.Str::uuid().'","'.$row[0].'","'.$row[1].'","'.$row[2].'","'.$gender.'","'.$row[4].'","'.$password.'"),';
}
$sql = substr($sql,0,-1);
DB::insert($sql);
}
此前也尝试过单条数据入库
if (count($rows) > 1) {
unset($rows[0]);
DB::transaction(function () use ($rows) {
foreach ($rows as $row) {
Admin::create([
'nickname' => $row[0],
'parent_id' => $row[1],
'title' => $row[2],
'gender' => $row[3] == '男' ? 1 : 2,
'mobile' => $row[4],
'password' => Hash::make($row[5]),
]);
}
});
}
laravel 支持批量插入
xlswriter 异步
博客:[xlswriter] PHP 高性能 Excel 扩展完全适配 Windows,与 PHPSpreadS...
用这个大佬的,然后队列异步处理
插入需要节流?
可以将数据处理后写入临时文件,然后用 load data infile 语句
xlswriter 读取会快些
mysql 中的 innodb_flush_log_at_trx_commit 设置成 2 , 再次插入会快很多
建议批量插入
如果需要保证业务正常运行,建议在每次插入之后加个延迟(usleep),避免插入占用所有资源导致卡顿。
批量啊,或者异步批量