Laravel has a neat way of generating fake data to your database for development and testing purposes.
Using Laravel Seeding, you can quickly seed a hundred records to your users table. That's done in less than a second, no problem.
User::factory(100)->create();
How about a thousand? Okay, that's done in around 4 seconds:
User::factory(1000)->create();
How about a hundred-thousand? That takes around 6 minutes, and starts hurting your server:
User::factory(100000)->create();
Now how about a million? Don't even bother, your server will freeze to death:
User::factory(1000000)->create();
So, how can we actually seed fake 1-million users to our database? We use chunking and database transactions.
Here is our OneMillionUsersSeeder
class generated via php artisan make:seeder OneMillionUsersSeeder
:
<?php
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class OneMillionUsersSeeder extends Seeder
{
/**
* The number of fake users to create.
*/
protected static $users_count = 1000000;
/**
* The number of fake users to chunk
* based on the users count.
*/
protected static $chunk_size = 1000;
/**
* Create 1-million users quickly (~5 minutes)
* in non-production environments such as
* local and staging environments.
*
* To do this, we implement chunking and database transactions
* to speed up the process significantly and reliably.
*/
public function run(): void
{
if (app()->environment() == 'production') {
return;
}
for ($i = 0; $i < self::$users_count / self::$chunk_size; $i++) {
DB::beginTransaction();
try {
User::factory()
->count(self::$chunk_size)
->create();
DB::commit();
} catch (Exception $e) {
DB::rollback();
}
}
}
}
Here it is run by the cheapest 5USD VM in Linode:
1-million fake users created in 332,443 ms (5 minutes).
How about a billion? We shall see.
You may see the demo Laravel source code here.
Top comments (0)