db_selectがdb_queryよりはるかに遅いことを考えると、なぜそれを使用したいのでしょうか?


回答:


88

SelectQueryを使用する5つの理由があります

  • さまざまな数の条件、結合、フィールドなどを使用して動的クエリを構築しています。例については、field_read_fields()を参照してください。

  • いわゆるExtendersを使用します。エクステンダーの例は、PagerDefault(pager_query()を置き換える)およびTableSort(tablesort_sql()を置き換える)です。これらにより、SelectQueryに機能を追加できます。カスタムテーブルのデータを使用してページャーでソート可能なテーブルを作成する方法も参照してください。例:node_page_default()

  • 他のモジュールがクエリを変更できるようにします。その後、いわゆるタグを追加すると、SelectQueryはそのタグに対応するalterフックを自動的に呼び出します。私は、Privatemsgモジュールでこれに大きく依存しています(既にD6でカスタムクエリビルダーを使用してこれを行っています)。

  • node_accessシステムを使用して、ユーザーに表示を許可するノードのみを表示する場合/必要な場合。「node_access」タグを$ queryに追加するだけです。これはdb_rewrite_sql()を置き換えます。

  • SelectQueryには、サポートされているすべてのデータベースでコードを同じように機能させるのに役立ついくつかの機能があります。たとえば、SelectQuery :: orderRandom()があります。また、LIKE条件がある場合、-> condition( 'field'、$ value、 'LIKE')は、常に大文字と小文字を区別しない比較であることを確認します。D6では、ずっと遅いLOWER()を使用する必要がありました。しかし、知る限りでは、この2つ以上はありません。

これらの理由が特定のケースに当てはまらない場合は、db_query()を使用します。


1
5番目のポイントである、orderRandom()などのデータベースポータビリティ機能と大文字と小文字を区別しないLIKEが追加されました。
ベルディール

6
6番目の理由として、データベース間の互換性を追加します。たとえば、Oracleクエリは、MySQLやPostgresなどとはいくつかの点で構文が異なります。db_select()から正しい構文を生成するコードを書く方が、非常に互換性のないクエリコードよりもはるかに簡単です。 db_query()に直接ダンプされます。
ブライアンV

9

についてdb_query()ドキュメントは言う:

SELECTクエリが単純なクエリ文字列である場合、この関数を使用します。呼び出し元または他のモジュールがクエリを変更する必要がある場合は、代わりにdb_select()を使用してください。


感謝しますが、それはまったく明確ではありません。「単純なクエリ文字列」の定義は解釈の余地がほとんどありません。6つの結合を持つ4つのテーブルを選択している場合、それはまだ単純なクエリですか、代わりにdb_select()で行う必要がありますか?
クリスコーエン

3
これは「単純なクエリ」ではなく、「単純なクエリ文字列」についてであり、単純は実際には動的ではなくハードコードされていることを意味します。詳細については私の答えを参照してください:)
ベルディール

9

小さなパフォーマンスの向上よりも読みやすさ、保守性、およびデータベース間の互換性を優先するため、常にdb_selectを使用します。さらに、言及された問題で示された数値は、全体的なパフォーマンスの誤ったイメージを与えると思います。複数のミリ秒の範囲で実行されることが多い単一の列よりも多くの列を返すクエリでは、300マイクロ秒の違いがあります。1回だけのオーバーヘッド(クラスの読み込み)があり、完全な(ページ)リクエストの違いがはるかに少ないことは驚くことではありません。


パフォーマンスの違いはそれほど単純ではありません。db_queryとdb_selectのパフォーマンスの比較を参照してください。Berdirの回答に記載されている特別な機能のいずれかが必要でない限り、db_selectよりもdb_queryをお勧めします。
geerlingguy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.