0

Coldfusion8 と MySQL 5.0.88 を使用した製品検索エンジンを使用しています。

製品検索には、複数ビュー単一ビューの 2 つの表示モードがあります。

Multipleは基本的なレコード情報を表示します。Singleは追加データをデータベースからポーリングする必要があります。

現在、ユーザーが検索を行っており、データベースをポーリングしています

(a)合計レコードと
(b) FROM から TO までのレコード。

ユーザーは常に現在の結果セットから単一ビューに移動するため、私の考えは、各ユーザーの現在の結果セットを保存し、データベースに再度クエリを実行して (無駄に) レコードの総数と (無駄に) 単一の以前にクエリしたレコードと、シングルビューにまだ必要な詳細情報を取得します。

しかし、私はこれでどこにも行きません。

各ユーザー(セッション)に固有であるため、現在の結果セットクエリをキャッシュできません。

クエリは、AJAX を介して呼び出している CFC 内の CFINVOKED メソッド内で実行されているため、クエリ全体が実行され、その後 CFC および CFINVOKE メソッドが破棄されるため、クエリまたは variables.cfc_storage のクエリを使用できません。

したがって、私の考えは、現在の結果セットをセッションスコープに保存することでした。これは、ユーザーが実行する新しい検索ごとに更新されます (ページネーションまたは完全に新しい検索)。保存される最大の結果は、表示される結果の数になります。

次を使用して、クエリを問題なく保存できます。

 <cfset Session.resultset = query_name>

これにより、次のようにクエリ全体が結果とともに保存されます。

query
CACHED: false 
EXECUTIONTIME: 2031 
SQL: SELECT a.*, p.ek, p.vk, p.x, p.y
    FROM arts a
        LEFT JOIN p ON 
        ...
        LEFT JOIN f ON 
        ... 
        WHERE a.aktiv = "ja"
        AND 
        ... 20 conditions ...

SQLPARAMETERS: [array]
1) ... 20+ parameters

RESULTSET: 
 [Record # 1] 
    a: true
    style: 402
    price: 2.3
    currency: CHF
    ...
 [Record # 2] 
    a: true
    style: 402abc
    ...

これは、ユーザーが新しい検索を行うたびに上書きされます。ただし、ユーザーがこれらのアイテムのいずれかの詳細を表示したい場合、一時ストレージから必要なレコードにアクセスできるかどうかを照会する必要はありません (レコードの総数と 1 つのレコードを取得する)。このようにして、以前に取得したデータを取得するために、それぞれ2031の実行時間に相当する 2 つのデータベース トリップを節約できます。

トレードオフは、すべてのユーザーが Session.scope で最大 48 個の結果 (ページあたりのアイテムの最大数) の結果セットを持つことです。

私の質問:
1. これは実行可能ですか、それともデータベースを再クエリする必要がありますか?
2.上記のような構造/配列/オブジェクトがある場合、スタイル番号で必要なレコードを選択するにはどうすればよいですか = 結果セットにアクセスするにはどうすればよいですか? 保存されたクエリをループすることはできません(これをしばらく試してみました...)。

手伝ってくれてありがとう!

4

3 に答える 3

4

キスのルール。パフォーマンスが本当に問題であることが判明しない限り、データベースを再クエリしてください。正しいインデックスを使用すると、かなりうまくスケーリングするはずです。問題がある場合は、そこにクエリキャッシュを追加するだけです。

QoQ はオーバーヘッド (CF 側、メモリと計算) を導入し、古いデータを返す可能性があります (セッション内のクエリが DB 上のクエリよりも古い場合)。同じクエリが同じビューで使用されている場合にのみ QoQ を使用しますが、セッション期間全体では使用しません。

于 2012-07-13T17:41:08.483 に答える
2

実現可能ですか?はい、ユーザーの数とこれがメモリに保存するデータの量によっては、DB に再度アクセスするよりもおそらくはるかに優れています。

必要な単一のレコードを取得する最良の方法は、クエリのクエリです。CF では、既存のクエリをデータ ソースとして使用する別のクエリを作成できます。次のようになります。

<cfquery name="subQuery" dbtype="query">
  SELECT *
  FROM  Session.resultset
  WHERE style = #SelectedStyleVariable#
</cfquery>

CFBuilder を使用している場合、データソースがないためにおそらく Error が叫ばれることに注意してください。これは CFBuilder のバグです。DBType が「query」の場合、データソースは必要ありません。

于 2012-07-13T17:27:13.237 に答える
1

レコードの数に応じて、ID がキーである構造体としてアプリケーション スコープに詳細データを格納します。何かのようなもの:

APPLICATION.products[product_id].product_name
                                .product_price
                                .product_attribute

そうすれば、オンデマンドでアイテムの ID を照会するだけで済みます。

また、「オンデマンド」クエリを改善するには、少なくとも 2 つの「コード内」オプションがあります。2. Verity または SOLR を使用してすべてのインデックスを作成すると、検索コレクションを更新するときにすべてのクエリを実行するだけで済みます。これは、単一のクエリごとにすべての結合を行うよりもはるかに高速です

于 2012-07-13T18:33:43.550 に答える