我正在尝试从一个数据库中提取大量数据,重命名这些列,然后将其转储到另一个数据库中。我开始超时,并增加了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);
}
此方法有效,但如上所述超时。
是否有一种更有效的方式来处理此问题,或者我应该增加其他时间限制直到它起作用?请记住,这将通过作业每天运行一次或两次。
答案 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中完成,您也可以尝试这种方法。