200万行のデータを高速処理!Laravel Eloquent クエリのパフォーマンスを劇的に向上させる7つの秘訣
Laravel Eloquent クエリが 200 万行で長時間実行される場合の解決策
解決策
以下の解決策を試すことができます。
インデックスの作成
Eloquent クエリで頻繁に使用されるカラムにインデックスを作成することで、クエリのパフォーマンスを大幅に向上させることができます。
例:
Schema::table('users', function (Blueprint $table) {
$table->index('name');
$table->index('email');
});
スコープの使用
Eloquent スコープを使用して、クエリを絞り込むことで、処理時間を短縮することができます。
public function scopeActive($query)
{
return $query->where('status', 'active');
}
$users = User::active()->get();
チャンク処理の使用
Eloquent チャンク処理を使用すると、大量のデータを小さな塊に分割して処理することができます。
User::chunk(1000, function ($users) {
foreach ($users as $user) {
// ...
}
});
データベース接続の最適化
データベース接続の設定を調整することで、パフォーマンスを向上させることができます。
config([
'database.connections.mysql.read' => [
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'database',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
]);
キャッシュの使用
頻繁に実行されるクエリ結果をキャッシュすることで、処理時間を短縮することができます。
Cache::remember('users', 60, function () {
return User::all();
});
$users = Cache::get('users');
- Eloquent クエリログを有効にして、クエリのパフォーマンスを分析することができます。
- Laravel Debugbar を使用して、クエリの実行時間を確認することができます。
// インデックスの作成
Schema::table('users', function (Blueprint $table) {
$table->index('name');
});
// スコープの使用
public function scopeByName($query, $name)
{
return $query->where('name', $name);
}
// チャンク処理の使用
User::chunk(1000, function ($users) {
foreach ($users as $user) {
// ...
}
});
// データベース接続の最適化
config([
'database.connections.mysql.read' => [
'host' => '127.0.0.1',
'port' => '3306',
'database' => 'database',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
]);
// キャッシュの使用
Cache::remember('users', 60, function () {
return User::all();
});
$users = Cache::get('users');
// クエリの実行
$users = User::byName('John')->get();
Eloquent クエリよりも効率的なクエリを作成するために、直接クエリビルダを使用することができます。
$users = DB::table('users')
->where('name', 'John')
->get();
リレーションの最適化
N+1 問題を回避するために、リレーションを適切に設定する必要があります。
public function posts()
{
return $this->hasMany(Post::class);
}
データベースのチューニング
innodb_buffer_pool_size = 1G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
適切なデータ型を使用する
データ型を適切に選択することで、データベースのストレージとパフォーマンスを向上させることができます。
$table->string('name', 255);
$table->integer('age');
$table->decimal('price', 10, 2);
不要なクエリを避ける
不要なクエリを実行しないように、コードを見直す必要があります。
$user = User::find(1);
// 不要なクエリ
$user->name;
// 代替方法
$user->name = 'John';
$user->save();
最新の Laravel バージョンを使用する
最新のバージョンの Laravel には、パフォーマンスの改善が含まれている場合があります。
フレームワークの代替品の検討
特定の要件によっては、他のフレームワークの方がパフォーマンスが優れている場合があります。
laravel laravel-5 indexing