快速向有关系的表中插入 200 多个数据 - Laravel 5.6

Posted

技术标签:

【中文标题】快速向有关系的表中插入 200 多个数据 - Laravel 5.6【英文标题】:Fastly insert 200+ data to the tables with relationship - Laravel 5.6 【发布时间】:2021-12-08 02:36:29 【问题描述】:

表格:空缺职位

id int 无符号自动增量 code varchar(191) NULLstart_time timestamp NULLend_time timestamp NULLbusiness_unit_id int unsignedjob_id int unsignedon_date datebreak int NULLshift_id int unsignedtotal_numbers int

表格:vacancy_details

id int 无符号自动增量 vacancy_id int unsignedday_id int unsignedshift_id int unsignedrate_type enum(' flat_rate','hourly_rate') [hourly_rate]start_time 时间戳 NULLend_time 时间戳 NULLbreak int NULLtotal_hours 十进制(10,2) NULL client_rate 十进制(8,2) NULL

表格:vacancy_staff_rates

id int 无符号自动增量 vacancy_id int unsignedvacancy_detail_id int unsigned NULLemployment_type_id int unsignedstaff_rate decimal( 8,2) 空

public function store_multiple($subdomain, Request $request)
    if($request)
        $payloads = $request->data;
        foreach($payloads as $payload)
            $payload = (object) $payload;
            //insertion(3 tables) and all the calculations and logic are doing in this add_vacancy()
            $vacancy = Vacancy::add_vacancy($payload);
        
    

这是 3 张桌子。当我添加 10 或 20 时,插入速度很快,但 100 或更多则需要更多时间。任何人都可以建议一种更胖的方法吗?

【问题讨论】:

尝试实现作业和队列。它会将您的工作分成更小的块。参考 - laravel.com/docs/8.x/queues. 但是如果我需要每条记录的即时验证结果怎么办? @VivekPawar “太慢”有多慢?即使以最慢​​的方式,我预计 200 次单行插入也不会超过 2 秒。有多种方法可以加快速度。磁盘是 HDD 还是 SSD? @RickJames 不是 200 单行插入,在插入每一行之前应该有一些验证和计算。表示为每个空位行获取每天的费率。 【参考方案1】:

建议:

将 200 行收集到一个单独的表中(可能是一个TEMPORARY 表)。然后在此表中根据需要调整值。一些(全部?)按摩可以批量进行;也就是说,同时所有 200 行。如果您需要“规范化”(将一些字符串转换为 id),现在是这样做的好时机。

然后,作为最后一步,执行单个 INSERT INTO real SELECT ... FROM temp 将它们放在它们所属的位置。

【讨论】:

以上是关于快速向有关系的表中插入 200 多个数据 - Laravel 5.6的主要内容,如果未能解决你的问题,请参考以下文章

在Doctrine中插入有关系的记录后获取ID

sql 只向一个有 10 个字段的表中插入两个值

Laravel eloquent 从不一定有关系的表关系中将数据从大到小排序

将值插入到存在于多个数据库中的表中

怎么在MYSQL数据库的表中插入一个double型数据?

如何使用 laravel 模型呈现两个有关系的表,例如“sales”表和“sales_content”的情况