0

ユーザーがデータベース内のアイテムを検索できるようにするWebアプリを開発しています。アイテムはいくつかのカテゴリに分類されます。返される各検索項目は、そのフィールド値に応じて異なる方法で表示されます。現在、表示を処理するクラスと検索を処理するクラスを作成しました。検索クラスは、いくつかのユーザー入力を使用してSQLクエリを作成し、ユーザー入力に一致するアイテムのIDをデータベースに照会し、配列内のIDを表示クラスに送信します。

これを行うコードの抜粋:

//the sql query is actually a little more complex than this
$query = "SELECT items.id FROM items, subcategories WHERE {$name} AND items.`base_school` = '{$_SESSION['base_school']}' AND items.subcategory = subcategories.id AND subcategories.parent_category = {$search_category} ORDER BY `time_added` DESC {$limit}";
$result = $DB_CONNECTION->query($query);
$newly_added = array();
while  (list($id) = $result->fetch_row()) $result[] = $id;
searchDisplay::print_result($result);

displayクラスは、データベースに各アイテムの完全な詳細を次々に照会し、表示されるとおりに表示します。

私の質問は、データベースが最初にクエリされたときにアイテムの完全な詳細(3つの異なるテーブルからの約23フィールド)をデータベースにクエリし、データを配列に格納してから、その配列を表示クラスにアイテムの一意のIDを使用して各アイテムのデータベースを照会させるのではなく、表示クラス?私の現在のソリューションは今のところ正常に実行されていますが、データベースが大きくなり始めたとき(約500,000行)にアプローチに問題があるかどうかを知る必要があります。

次に、データベースからのデータは、ユーザーが指定したいくつかの検索条件を使用してフィルタリングされます。すべてのユーザーの条件に対応するいくつかの結合を含む複雑なクエリを作成するか、主要なフィルターに対応する単純なクエリを作成し、PHPを使用して検索条件に一致しない残りのいくつかの結果をフィルター処理する方がよいでしょうか。

4

3 に答える 3

1

クエリをループに入れないようにする必要があります。単一のクエリは、たとえそれが複雑であっても、通常はより高速で、より優れたスケーリングを実現します。すべての「ルール」と同様に、例外があります。ループが複雑なクエリよりもはるかに高速である場合は、ループが数十回または数百回の反復を実行するように成長しないことがわかっているので、ループを維持する必要があります(右?)。

DBまたはPHPでのフィルタリングに関しては、通常、DBでフィルタリングを行い、ネットワークを介して不要なデータを転送しないようにすることをお勧めします。MySQLでHAVINGオプションを使用することは、通常、PHPで物事をフィルタリングするために行うことと同じです。

于 2012-10-14T21:28:59.957 に答える
1

You need to keep latency in mind. Often with networked apps that run slowly, latency is the culprit.

Even if each individual query is tiny and can be executed quickly, they all have latency. You say worst case, 100 queries.

Even if there is only 10 milliseconds of latency for each query (keep in mind each query requires overhead from network drivers, the actual round trip time on the wire, etc) you needlessly add 100*10ms = 1 second (incredibly long by computer terms).

Most likely it would take much less than one second to simply execute 1 query that gets all the info in one shot. Then you only incur the latency penalty once.

So I suggest rewriting your approach to use one query, and pass around arrays, as you suggest.

Things like this slip through testing all the time because people test in an environment where the latency between client and server is very very low (for instance on same server without much activity). Then app goes real world, and the client and server are both busy and hundreds of miles apart...

于 2012-10-22T16:45:25.430 に答える
1

私の意見では、各ステップで結果のフィルタリングを行う必要があります。それ以外の場合、データが大きくなるにつれてクエリが遅くなります。したがって、最後の段落で述べた戦略が最適です。

于 2012-10-14T21:27:16.250 に答える