使用Laravel Eloquent,我在旧的Mysql数据库中的一个表中复制了7百万行数据,并将这些行放在我的新Mysql数据库的不同表上。问题是执行此操作花了将近一天的时间,我需要为几乎80M的行重新执行此操作。我一次使用1000个数据块。有没有办法做到这一点 更有效率?? 这是我的代码:
DB::connection('oldDataBase')->table('tableToCopy')->chunk(1000, function ($AllData){
foreach ($AllData as $Data){
DB::connection('newDataBase')->table('table1')->insert(
[
column1 => $Data->columnToCopy,
etc..
]);
DB::connection('newDataBase')->table('table2')->insert(
[
column1 => $Data->columnToCopy,
etc..
]);
DB::connection('newDataBase')->table('table3')->insert(
[
column1 => $Data->columnToCopy,
etc..
]);
}
});
答案 0 :(得分:1)
从像laravel这样的SQL客户端执行此数据迁移不是一个好主意。
如果我必须移动80M行,我将采取以下步骤:
LOAD DATA INFILE
一个接一个地填充CSV文件。为了获得最快的结果,应该从与MySQL服务器相同的计算机上运行的mysql
或mysqlimport
命令行客户端程序运行。我在迁移日之前对此进行了广泛的测试。我会做一些事情,比如加载第一个和最后一个CSV块并重新启用索引和约束。
评论中提出了另一种可能性。使用mysqldump
,然后通过mysql
客户端程序加载生成的文件。
为此避免使用gui风格的mysql客户端程序。坚持使用命令行程序。与那些GUI客户端一样好,它们没有设计用于以数十兆字节的.SQL文件进行流式传输。