2016-04-28 46 views
0

所以基本上,我得到了2个表格。 第一个表格包含100万行或其他内容,其中有一个名为'telefon'的空字段。Laravel从数据库表到另一个表1mill rows,slow

现在,我得到了第二个表,其中有另一个表中的'telefon'字段值。

我想出了这个解决方案,但这需要永远。这已经过去了一个小时,检查数据库表时只有1600行。有没有更快的方法来做到这一点?提前致谢。

DB::table('phones') -> orderBy('id') -> chunk(100, function($old) { 
     foreach ($old as $x) { 
      DB::table('companies') 
       -> where('organisasjonsnummer', $x -> businessCode) 
       -> update([ 
        'telefon' => $x -> contact 
       ]); 
     } 
    }); 

回答

1

呵呵,foreach +查询几乎总是不好的。如果我没有记错的话,你想做到这一点:

UPDATE companies, phones SET companies.telefon = phones.contact WHERE companies.organisasjonsnummer = phones.businessCode 

这可能是如果没有指数companies.organisasjonsnummerphones.businessCode列很慢,但它会占用大量的时间,现在指数它们为好,所以我不确定现在是否有任何好处将它们编入索引,如果它们稍后不会使用。无论如何,使用单个查询应该至少在一定程度上更快。

+0

是的,那就是我想要做的。不,他们没有编入索引。 但我同意,这会更快,但我怎么会写在Laravels查询建设者?我应该使用'DB :: raw(...)'吗? 谢谢。 – Kaizokupuffball

+0

因为没有要转义的参数,所以可以将它包装到'DB :: statement()'中,这只是一个普通的查询。 –

+0

我明白了。看起来它正在工作。谢谢! :) – Kaizokupuffball

0

一定要记住,当你在循环中使用Eloquent/SQL时,你会为每一轮运行一个命令。 这同样适用于延迟加载。

在这种情况下,您应该使用\DB::statement("put your sql here");或在这种情况下\DB::update("put your update here");,让数据库为您做的服务,并开心!

相关问题