php—需要从一个数据库中提取大量数据并插入到另一个数据库中

mspsb9vt  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(533)

我正在尝试从一个数据库中提取大量数据,重命名列,然后将其转储到另一个数据库中。我开始超时,增加了最大执行时间和最大输入时间。这有帮助,但我仍然没有得到所有的数据。我接着补充说:

set_time_limit(0);
ignore_user_abort(1);

这使我能够提取的数据量增加了一倍,但我仍然很短,所以它仍然超时。我想知道是否有更好的方法来做这件事。
我使用的是laravel5.6,php7.2,mysql 5.6
我从一个数据库中提取数据并插入到另一个数据库中。

$availabilities = DB::connection('mysql2')->select('select vi.status as availability_status_code,vi.date as availability_date,v.masterid as im_id from table1 vi
inner join table2 v on v.id = vi.vid where vi.date >= CURDATE() and v.masterid > 0 order by v.masterid,vi.date'); //
foreach($availabilities as $availability) {
    Availabilities::create((array)$availability);
}

这是可行的,但正如所指出的那样。
有没有更有效的方法来处理这个问题,或者我应该增加不同的时间限制,直到它起作用?请记住,这将运行一天一次或两次通过作业。

gtlvzcf8

gtlvzcf81#

您可以使用:

DB::table('yourtable')->insert([['name' => '1st record'], ['name => '2nd record']]);

当然,您应该将其分块,因此您不应该以这种方式插入例如100万条记录,但是您应该将100万条记录分解为例如200条记录的数组。这将比像现在这样分别插入每条记录快得多。
可以使用collection chunk方法对 $availabilities 分成更小的部分

guz6ccqo

guz6ccqo2#

如果数据库用户对数据库都有权限,并且从一个源获取数据和向另一个源添加数据之间不涉及任何处理,则可以尝试在单个查询中执行此操作。

INSERT INTO database2.table_name (availability_status_code, availability_date, im_id)
SELECT vi.status AS availability_status_code, vi.date AS availability_date, v.masterid AS im_id 
FROM database1.table1 vi
    INNER JOIN database1.table2 v ON v.id = vi.vid 
WHERE vi.date >= CURDATE() AND v.masterid > 0
ORDER BY v.masterid,vi.date

如果涉及到一些处理,并且可以在mysql中完成,您也可以尝试这种方法。

相关问题