3

私はphp-mysqlアプリケーションを書いています。このアプリケーションにより、ユーザーはデータベースに対して検索を実行できます。検索の実行時に、ユーザーが検索によって表示された項目を調べた後、[戻る] ボタンをクリックして戻ると、クエリを再送信するかどうかを尋ねられます (post を使用します)。データベースで検索を再実行します。get を使用しても再投稿のリクエストは発生しませんが、検索は再度実行されます。

データベースで再実行せずに、検索を保存して呼び出す方法はありますか?

これは、データベースに保存することも、何らかの方法でphpに保存することもできます-おそらくセッションで?これらの検索から大量のデータが得られる可能性がありますが、おそらくセッションには多すぎるように感じます。

私が想像できるもう1つの方法は、データベースの一時テーブルに保存することです。クエリする列を含むテーブルを作成してから、挿入を選択します。次に、テーブルから * を選択します。これもかなり悪い考えのようです。動的に作成された多くの一時テーブルが浮かんでいます。

私はこれができることを知っています。保存された検索は、多くの Web アプリケーションで見られるものです。では、一般的にはどのように行われているのでしょうか。

4

2 に答える 2

2

memcached

また

APC

ただし、検索結果をキャッシュする理由を説明していないことに気付きました。「より高速で、アプリがよりスケーラブルになると読んだので」がこれの通常の理由です。これは時期尚早の最適化のようなにおいがします。

アプリケーションをビルドしてプロファイリングすることをお勧めします。これらの「検索」にはどのくらいの費用がかかりますか?なぜ彼らは高価なのですか?スキーマ設計が貧弱ですか?インデックス作成が不十分ですか?ストレージエンジンの選択が悪いですか?

MySQLにクエリキャッシュがあることをご存知ですか?多くの場合、これで十分です。mysqlクライアントを使用して高価な「検索」クエリの1つを実行し、時間を記録してから、もう一度実行してみてください。見る?

于 2010-01-24T04:40:52.303 に答える
1

「再送信しますか」エラーを修正するには、リクエストをセッションまたはデータベースに保存し、すぐに新しいページにリダイレクトして実際に検索を実行します。

search.php?searchId=22

if (isset($_GET['searchId'])) {
  $search = $_SESSION['search'][$_GET['searchId'];
  // do search
} elseif (isset($_POST['search'])) {
  $_SESSION['search'][] = $_POST;
  header('Location: search.php?searchId=' . (count($_SESSION['search']) - 1);
}

次に、$ _ SESSION['search'][22]またはdb...からクエリフィールドを取得できます。

結果の保存に関しては、ブラウザのキャッシュに依存するか、セッションまたはデータベースに個々のSERPを保存できます...必要に応じて、ある時点で古いものを期限切れにします...

結果テーブルを作成することは問題ありませんが(複雑な検索でのページ付けが高速化されます)、そこに数百万のヒットが発生する可能性があるため、キャッシュを使用したページ付けがより一般的な方法になります。

ユーザーが数日または数週間後に検索に戻りたい場合は、保存されたクエリフィールドを使用して検索を再実行できます。

于 2010-01-24T04:41:19.933 に答える