web-dev-qa-db-ja.com

Laravel Eloquent vs Query Builder-eloquentを使用してパフォーマンスを低下させる理由

Laravelクエリビルダーと雄弁の間でパフォーマンステストを行いました。クエリビルダは、さまざまなsqlステートメント(select-update-delete-insert)ではるかに高速でした。

だから私の質問は次のとおりです:なぜ誰かがLaravel Eloquentをプレーンクエリビルダに対して使用するのですか?

51

EloquentはLaravelのActive Recordパターンの実装であり、長所と短所がすべて備わっています。 CRUDの方法で単一のエンティティを処理するときに使用するのに適したソリューションです。つまり、データベースから読み取るか、新しいエンティティを作成してから保存または削除します。ダーティチェック(変更されたフィールドのみにSQL UPDATEを送信する)、モデルイベント(たとえば、誰かが新しいアカウントを作成したときに管理アラートを送信する、または統計カウンターを更新する)などのEloquentの機能から多くの恩恵を受けますタイムスタンプ、ソフト削除、カスタム特性)積極的/遅延読み込みなど。

ただし、既にご存じのとおり、パフォーマンスには多少の代償が伴います。単一または少数のレコードを処理する場合、心配する必要はありません。ただし、大量のレコードを読み取る場合(データグリッド、レポート、バッチ処理など)には、プレーンDBの方が適しています。

このアプリケーションでは、WebフォームでLaravel's Eloquentを使用して1つのレコードを処理し、DB(SQLビューを使用)を使用してグリッド、エクスポートなどのデータを取得します。

91
JustAMartin

はい、場合によっては正しいです。 データが増えたらそしてほとんどすべてのサイトで、データは本当に小さくありません。次に、Eloquent QueryよりDB Queryを使用するほうが適切です

Eloquent VS DBのパフォーマンスの問題で聞いたことがある、

単純なテーブルに1000行を挿入するには、Eloquentには1.2秒かかります。その場合、DBファサードには800ミリ秒(ms)しかかかりません。

だから、なぜEloquent?その必要はありませんか?

答えは-雄弁も必要です。原因-

より良い関係を作成するに、結合する必要がある場合に、非常に単純な構文で結果を表示します。

EloquentはSQLクエリの知識があまりない人向けです。

MVCフレームワークコードの読みやすさ、コードの保守性のルールに従うおよびEloquentがどれであるか、あなたはそれを知っています。以下のコード比較。明らかに、Eloquentの方が読みやすいです。

// In Eloquent
$student = App\Student::find($id);

// In DB facade
$student = DB::table('student')->where('id', $id)->first();

最も重要な部分は我々が他のデータベースを変更したいである場合、生のクエリは私たちにとって非常に頭痛の種であり、その場合Laravel Eloquentは片手ですべての問題を解決します。さまざまなタイプのデータベースを処理できます。

だからEloquentを使用するとき、およびDBファサードの場合:

  1. シンプルなCRUDを使用してシンプルで小さなレコードサイトで作業し、レコードが事実でない場合は、Eloquentを使用します。
  2. 多数のレコードを処理する場合は、EloquentよりもDB Queryを使用することをお勧めします。

最後に、データベースクエリを使用するときとEloquentクエリを使用するときが最終的にクリアされます。

編集-実際の例

  1. University websiteを作成しています。最大5,000 teachers and 10,000 students and some notices and filesを含む場合があります。次に、非常に標準的で読みやすい単純なLaravel Eloquentを使用してこれを行うことをお勧めします。
  2. 今、私はStackoverflowのようなサイトを作っています。 1,000,0000 (1 crore) posts and many more thingsを超えるものが含まれる場合があります。そこで、従来のDBファサードを選択する必要があります。大量のレコードから投稿を検索する方が高速です。

Laravel Debugbar (Eloquent /データベースクエリパフォーマンス/実行時間をチェックする一般的なパッケージ)を使用してクエリパフォーマンスを確認できます。

今、あなたの選択です。あなたが作りたいもの...

30

なぜLaravel Eloquent:

  1. OOP方式でクエリを実行します。
  2. 生のクエリやquery builderよりも使いやすい。
  3. table schemaとのバインドはありません。つまり、テーブル名を変更した場合でも、それを機能させるために単一のquery(1000 queryがある場合があります)に触れる必要はありません。雄弁modelのテーブル名を変更するだけです。
  4. テーブル間の関係は、エレガントな方法で維持できます。リレーションシップのタイプに言及するだけで、関連テーブルのデータを取得するためにクエリで他に必要なものはありません(JOIN, LEFT JOIN, RIGHT JOINなど)。
  5. クエリビルダと比較してEloquentを使用して記述されているクエリは、非常に読みやすくなっています。
26
Imran

パフォーマンスの面でアプリケーションが成長する場合、比較のために、次の表を参照してください。

Eloquent ORMとRaw SQLの間の選択操作の平均応答時間の比較

雄弁なORM平均応答時間

Joins | Average (ms) 
------+-------------
1     | 162,2 
3     | 1002,7 
4     | 1540,0 

Result of select operation average response time for Eloquent ORM 

生のSQL平均応答時間

Joins | Average (ms) 
------+-------------
1     | 116,4 
3     | 130,6 
4     | 155,2 

Result of select operation average response time for Raw SQL 

記事リファレンス

9
Mohammad Naji

それは私の意見であり、包括的な答えではありません。特定の状況でより便利なものを使用します。

雄弁またはクエリビルダーで記述されたパッケージまたはコードに出くわした場合、使用されているものは何でも使用します。

ゼロから何かを作成すると、クエリビルダーがより直感的になることがわかったため、より頻繁に使用します。

Laravelに関しては、パフォーマンスよりもアプリの開発の容易さと速度がより重要であると思われます。私は、php/mysqlの予備知識がほとんどない人でも、すべてが非常に簡単になることを本当に気に入っています。場合によっては、雄弁はクエリビルダよりも簡単です。他の逆も同様です。 Laravelがとても簡単で初心者に優しいのは、何かをするための多くの方法があることだと思います。

4
Arthur Tarasov

データベースから複雑なクエリを作成するときにクエリビルダを使用するのは好きです。単一のテーブルで作業するには、雄弁が好きです。

1
HENG Vongkol

Eloquent ORMは、特定のテーブル内の少ないデータで作業するのに最適です。一方、クエリビルダは、Eloquent ORMよりも1つまたは複数のテーブルにある場合でも、多数のデータの処理にかかる時間が短縮されます。

私の場合、17500未満のエントリを保持するテーブルを持つアプリケーションでELoquent ORMを使用します。テーブルに17500を超えるエントリが格納されると予想される場合は常に、クエリビルダーが最適です。

さらに、サブクエリを使用するアプリケーションでは、ELoquent ORMよりもクエリビルダを好みます。

0
Patrick N.