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]),
        ]);
    }
    });
}
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8
AloneUtopia

可以将数据处理后写入临时文件,然后用 load data infile 语句

1年前 评论
Tomo11111

laravel 支持批量插入

Admin::insert($array);
1年前 评论
Kevin_Livingston (楼主) 1年前

xlswriter 异步

1年前 评论

xlswriter 读取会快些

mysql 中的 innodb_flush_log_at_trx_commit 设置成 2 , 再次插入会快很多

建议批量插入

如果需要保证业务正常运行,建议在每次插入之后加个延迟(usleep),避免插入占用所有资源导致卡顿。

1年前 评论

批量啊,或者异步批量

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!