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

时间:2018-08-21 19:59:40

标签: php mysql laravel

我正在尝试从一个数据库中提取大量数据,重命名这些列,然后将其转储到另一个数据库中。我开始超时,并增加了max_execution_time和max_input_time。这有所帮助,但我仍然没有获得所有数据。然后,我添加了以下内容:

set_time_limit(0);
ignore_user_abort(1);

这使我能够提取的数据量增加了一倍,但我仍然很短,因此仍然超时。我想知道是否有更好的方法可以做到这一点。

我正在使用Laravel 5.6,php 7.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);
}

此方法有效,但如上所述超时。

是否有一种更有效的方式来处理此问题,或者我应该增加其他时间限制直到它起作用?请记住,这将通过作业每天运行一次或两次。

2 个答案:

答案 0 :(得分:0)

您可以使用:

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

当然,您应该将其分成几部分,所以您不应该以这种方式插入例如100万条记录,但是应该将100万条记录分解为例如200条记录的数组。这比您现在分别插入每个记录要快得多。

您可以使用集合chunk方法将$availabilities分成较小的部分

答案 1 :(得分:0)

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

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中完成,您也可以尝试这种方法。

相关问题