高速なdb_query、db_select、またはEntityFieldQuery


15

だから、db_query、db_select、またはEntityFieldQueryの方が速いかどうかを調べようとしています。現在、EntityFieldQueryを使用しています。約1600のノードエントリを取得しています。

これはシステムに負担をかける可能性があることを理解しているため、1600ノードを取得するのに最適なオプションを見つけたいだけです。私が構築しているアプリケーションでは、数秒または数ミリ秒の削り取りが重要になります。

回答ありがとうございます。


プロファイルを作成しましたか?
mpdonadio

よく分からない。少し詳しく説明してもらえますか?
ホルヘカルデロン

使用すべきものは、正確に何をしようとしているかによって異なりますか?詳細を提供できる場合は、お手伝いできる場合があります。多くのクエリを実行している場合、db_query()が最も高速です。ただし、エンティティ(entity_load)を読み込んでいる場合は、1600以上のエンティティを読み込むときにentity_loadが遅くなるため、おそらく重要ではありません。
donutdan4114

1
クエリコード/クエリの速度だけではありません。たとえば、ノードへのアクセスが必要ですか?
ルービー

@rooby-うん。EntityFieldQueryを使用し続けましたが、必要に応じて、ノード内の3つのカスタムフィールドにアクセスする必要があります。ただし、rafがかなり良いアドバイスと数字を提供してくれたため、以下の回答は依然として最良の回答です。それはまさに私が探していたものでした。
ホルヘカルデロン14

回答:


24

簡単に質問に答えるには、db_queryが最速です!いくつかの理由、事実、およびさまざまな質問、ソースからまとめられた図を以下に示します。

この質問の簡単なグーグル検索では、次の結果が得られます。

For simple queries, db_query() is 22% faster than db_select()
For simple queries, db_query() is 124% faster than EFQ
For queries with two joins, db_query() is 29% faster than db_select()

この

db_query():

Total Incl. Wall Time (microsec):   796 microsecs
Total Incl. CPU (microsecs):    0 microsecs
Total Incl. MemUse (bytes): 123,352 bytes
Total Incl. PeakMemUse (bytes): 124,248 bytes
Number of Function Calls:   38

db_select()

Total Incl. Wall Time (microsec):   1,118 microsecs
Total Incl. CPU (microsecs):    0 microsecs
Total Incl. MemUse (bytes): 425,216 bytes
Total Incl. PeakMemUse (bytes): 436,392 bytes
Number of Function Calls:   88

上記に気づいた場合、db_selectはdb_queryより多くの関数呼び出しを行い、より多くのメモリを使用します。

  1. db_selectを使用する理由については、こちらをご覧ください
  2. db_selectではなくEntityFieldQueryを使用する理由については、こちらをご覧ください
  3. db_queryとdb_selectのパフォーマンスの比較については、こちらをご覧ください

選択はあなたの要件のみに基づくべきだと思います。EntityFieldQueryは遅いかもしれませんが、単純な構文、フィールドストレージがプラガブル、疎結合など、多くの利点を提供します。


1
これはまさに私が探していたものです。たくさんのRafに感謝します。
ホルヘカルデロン

1

そこでは非常に悪い考えです。1600ノードでは、APIを迂回してEntityFieldQueryを使用しないでください。あなたは間違ったものを最適化しています。


こんにちはChx、詳しく説明してください。要するに、1600ノードをプルする必要があります。私はすでにEntityFieldQueryを使用しているので、悪い考えが何であるかを理解しようとしています。私が見つけたのは、EntityFieldQueryが一部の領域で制限されていることです。これまでのところ、私に影響を与えるものは何もありません。とにかく、あなたの考えを聞くのを楽しみにしています。
ホルヘカルデロン14

1

すべての1600ノードからのフィールドデータが必要な場合は、EFQEが役立ちます。既にEFQをお持ちの場合は、サンドボックスページを見て、必要なものを見つけられるはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.