PHP は、ハッシュテーブルなどの一部のデータ構造を非常に効率的に処理します (通常の配列は、php ではハッシュテーブルとして扱われます)。それほど効率的でないのは、コード内でこれらの構造にアクセスすることです。以下でそれを実証してみましょう。
配列内のすべてのアイテムを繰り返し処理して、アイテムを比較して除外しているとします。私はあなたがそれを行うことができる2つの方法を考えることができます:
番号 1:
$arr = array_filter($arr2, function($item) { return $item > 2; });
array_filter
この場合、基本的にすべての $arr2 アイテムを反復処理し、それらが 2 より大きいかどうかを確認し、2 より大きい場合は $arr に追加します。
2番:
$arr = array();
foreach ($arr2 => $item) {
if ($item > 2) {
$arr[] = $item;
}
}
ここでも、すべての $arr2 アイテムを繰り返し処理し、それらが 2 より大きいかどうかをチェックして、それを $arr に追加しています。それは基本的にどのようarray_filter
に実装されたかです。
ここでの大きな違いは、php のコンパイル済みライブラリは、バイトコードがキャッシュされている場合でも、解釈されたコードよりもはるかに高速にデータ構造にアクセスすることです。先に進んで、いくつかのテストを実行してください。array_filter
コード内で個々の項目を開くよりも、1 回呼び出す方が高速です。
これらは教訓的な例にすぎないことに注意してください。すべての項目を反復処理して配列をフィルター処理することをお勧めしているわけではありません。これらの例は、PHP のデータ構造へのアクセスが、コンポーネント (この場合は mysql) にアクセスさせるよりも多少遅くなる可能性があることを示すためだけに使用しました。それだけでも、ある程度のパフォーマンスの向上を表しています。
MySQL 句で何かをフィルター処理する場合、以前のようにすべてのテーブル行を反復処理して不要なものを除外するわけではありません。しかし、あなたがすでに知っていることは、私はあなたが言ったことを繰り返すだけです.
結果セットの並べ替え、切り取り、カウントにも同じことが当てはまります。MySQL はおそらく、コード内よりも高速にデータ構造にアクセスします。
ここでの最適な結果 (結果セットのサイズによって多少異なりますが、大きくなる可能性があると考えています。さもなければ、ページネーションは必要ありません) は、MySQL に任せることです。
ただし、2 つのクエリを実行しても最適な結果が得られない場合があります。両方のクエリを (節を使用して) 連結できればUNION
、オーバーヘッドをいくらか節約できます。はい、醜いですが、理論的には高速に実行されるはずです (PHP は MySQL と非常に効率的に通信するため、見分けがつかないかもしれませんが)。わずかなパフォーマンスの向上のために、多くの可読性を犠牲にすることになります。
TL;DR: 2 つのクエリを実行して、最初に指定したオプションを使用します。