Laravelプロジェクトでは、トラフィックが増加するにつれて、データベースが速度を照会することは珍しくありません。最近、不動産プラットフォームのバックエンドを最適化したとき、私はこの問題に遭遇し、そこからいくつかの教訓を学びました。
データベース最適化は、開発可能で高いパフォーマンスアプリケーションの重要な分野の1つです。データの検索速度を改善し、応答時間とページの読み込み時間を短縮し、サーバーの負荷を削減し、コストを最小限に抑えることができます。
不動産プラットフォームの課題
これはまさに私たちのプラットフォームが遭遇したものです。 Sentry Alertには、生産環境でデータベースクエリが遅いため、警告が表示されます。監視は、検索結果のクエリが完了するのに5秒以上かかることを示しています - これは私たちが約束する速い経験とはほど遠いものです!
一般的なクエリ欠陥(回避方法)
以下は、その典型的な式です:
2。データベースインデックスのアート
<code>// 优化前 $properties = Property::all(); foreach ($properties as $property) { echo $property->agent->name; // 每个房产都会触发一个新的查询 } // 优化后 // 使用 `with()` 进行预加载 $properties = Property::with(['agent'])->get(); foreach ($properties as $property) { echo $property->agent->name; // 不需要额外的查询! }</code>
さまざまな種類のインデックスを理解してください
<code>// 基本的单列索引 Schema::table('properties', function (Blueprint $table) { $table->index('price'); }); // 多列的组合索引 Schema::table('properties', function (Blueprint $table) { $table->index(['city', 'price']); // 顺序很重要! }); // 唯一索引 Schema::table('properties', function (Blueprint $table) { $table->unique('property_code'); });</code>
<code> // 良好:匹配查询模式 $properties = Property::where('city', 'New York') ->whereBetween('price', [200000, 500000]) ->get(); // 索引应匹配此模式 $table->index(['city', 'price']); // 首先是城市,然后是价格</code>
columns columsは、句と命令でよく使用されます インデックス外側キー列
私が今まで見た中で最も一般的なエラーの1つは、デフォルトでselect *を使用することです。これは食料品店に行くようなものですが、店全体から物を買うので、食事の材料だけが必要です。以下はより良い方法です:
<code>// 优化前 $properties = Property::all(); foreach ($properties as $property) { echo $property->agent->name; // 每个房产都会触发一个新的查询 } // 优化后 // 使用 `with()` 进行预加载 $properties = Property::with(['agent'])->get(); foreach ($properties as $property) { echo $property->agent->name; // 不需要额外的查询! }</code>
大規模なデータセットを処理する場合、システムのリソースを圧倒してボトルネックを引き起こす可能性のある単一の操作ですべてのコンテンツを処理します。代わりに、LaravelのChunkメソッドを使用して、記録可能なバッチ処理レコードを管理できます。
<code>// 基本的单列索引 Schema::table('properties', function (Blueprint $table) { $table->index('price'); }); // 多列的组合索引 Schema::table('properties', function (Blueprint $table) { $table->index(['city', 'price']); // 顺序很重要! }); // 唯一索引 Schema::table('properties', function (Blueprint $table) { $table->unique('property_code'); });</code>
<code> // 良好:匹配查询模式 $properties = Property::where('city', 'New York') ->whereBetween('price', [200000, 500000]) ->get(); // 索引应匹配此模式 $table->index(['city', 'price']); // 首先是城市,然后是价格</code>
頻繁にアクセスされるデータ
以上がLaravel Performance Tuning:Scalabilityのためにデータベースクエリを最適化しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。