2017-08-20 1 views
-1

Ich habe diesen Cron-Job, den ich jeden Monat ausführen möchte, die zufällige Seriennummer jedem aktiven Kunden zuweist.Laravel: Wie foreach Datenbankupdate zu beschleunigen

Aber es dauert so lange zu laufen, mit 2000+ aktiven Kunden und jeder Kunde erhält 10 zufällige Serien, dauert es 20k + Update-Abfragen, um den Job zu beenden.

Wie könnte ich das beschleunigen?

foreach($subscriptions as $subscription){ 
    $updated_at = Carbon::now()->toDateTimeString(); 
    foreach($games as $game){ 
     DB::table('serials') 
      ->whereNull('user_id') 
      ->where('game_id', $game->game_id) 
      ->limit(1) 
      ->update([ 
       'user_id' => $subscription->user_id, 
       'updated_at' => $updated_at 
      ]); 
    } 
} 
+0

Die offensichtliche Sache wäre nicht während jeder Iteration Ihrer Schleifen eine Abfrage auszuführen. Gruppiere die Updates zusammen ... – Devon

+0

Ich kann nicht sehen, wie du jedem Benutzer 10 zufällige Serien gibst. Aus der Abfrage geben Sie jedem Benutzer die Seriennummer für jedes Spiel. – apokryfos

Antwort

1

können Sie versuchen:

foreach($subscriptions as $subscription){ 
    $updated_at = Carbon::now()->toDateTimeString(); 
    foreach($games as $game){ 
     DB::table('serials') 
      ->whereNull('user_id') 
      ->where('game_id', $game->game_id) 
      ->limit(1) 
      ->updateVeryFast([ 
       'user_id' => $subscription->user_id, 
       'updated_at' => $updated_at 
      ]); 
    } 
}