4

私はwordpressで作業していますが、それには優れたデータベース インターフェイスがあり、やや単純なクエリを多数実行するのに非常に便利です。

このインターフェイスを使用したかったのですが、特別なフィルタリングを行うことができません。次に、データベースから結果セットを返し、ネストされた if で php for を使用してフィルターを作成し、不要な結果を取り出すことができると考えました。

私は注文のために同じことを考えていました。

インデックスがある場合 (PHP では配列に対してインデックスを使用できませんが、mysql ではインデックスを使用できます)、フィルター (WHERE) や順序付けなどの操作は、シーケンシャルに比べて非常に高速です。

php_mysql アダプターのパフォーマンスについて考えていましたが、データの遅延読み込み、カーソル、およびデータベースから php にデータを渡す際のメモリへの影響などを使用しているかどうかはわかりません。

別の用途は、限定されたデータだけでなく合計数も必要とする、ページネーション リンクを生成する一般的なケースである、制限/カウントです。これを行うには、次の 2 つのオプションがあります。

  • 2 つのクエリを使用します。1 つはカウント用、もう 1 つは制限と実際のデータ用です。
  • 1 つのクエリを無制限に使用し、PHP で結果セットをカウントする

PHP と MySQL でこの作業を行うことのパフォーマンスへの影響を知っている人はいますか?

4

2 に答える 2

2

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 つのクエリを実行して、最初に指定したオプションを使用します。

于 2012-12-28T19:30:47.980 に答える
1

完全な結果セットを返し、PHP でそれらをカウントするのは、本当に悪い考えだと思います。エンド ユーザーに完全なカウントを表示する必要がある場合 (つまり、X/Y ページ)、データベース クエリを使用してレコード数を取得し、クエリを実行してページ分割されたデータを取得します。

于 2012-12-28T18:54:12.820 に答える