0

我有一个使用 Coldfusion8 和 MySQL 5.0.88 的产品搜索引擎

产品搜索有两种显示模式:多视图单视图

多个显示基本记录信息,单个需要从数据库中轮询附加数据。

现在用户进行搜索,我正在轮询数据库

(a)总记录和
(b)从 FROM 到 TO 的记录。

用户总是从他当前的结果集中进入单一视图,所以我的想法是为每个用户存储当前的结果集,而不必再次查询数据库来获取(浪费 a)记录总数和(浪费 b)单个记录我之前已经查询过,然后获取我仍然需要单视图的详细信息。

但是,我对此无能为力。

我无法缓存当前的结果集查询,因为它对每个用户(会话)都是唯一的。

查询在我通过 AJAX 调用的 CFC 内的 CFINVOKED 方法中运行,因此整个查询运行,然后 CFC 和 CFINVOKE 方法被丢弃,因此我不能使用查询或 variables.cfc_storage 的查询。

所以我的想法是将当前结果集存储在 Session 范围中,它将随着用户运行的每个新搜索(分页或全新搜索)而更新。存储的最大结果将是显示的结果数。

我可以使用以下方法存储查询:

 <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
    ...

每次用户进行新搜索时,这将被覆盖。但是,如果用户想查看其中一项的详细信息,我不需要查询(记录总数和获取一条记录)是否可以从我的临时存储中访问我需要的记录。这样,我将节省两次数据库行程,每次执行时间为2031次,以获取我之前已经提取的数据。

权衡是每个用户在 Session.scope 中拥有最多 48 个结果(每页的最大项目数)的结果集。

我的问题
1. 这是可行的还是我应该重新查询数据库?
2.如果我有一个像上面这样的结构/数组/对象,我如何通过样式编号从中挑选出我需要的记录=我如何访问结果集?我不能只循环存储的查询(现在尝试了一段时间......)。

感谢帮助!

4

3 回答 3

4

亲吻规则。除非您发现性能确实是一个问题,否则只需重新查询数据库。使用正确的索引,它应该可以很好地扩展。当这是一个问题时,您可以简单地在那里添加查询缓存。

QoQ 会引入开销(在 CF 端,内存和计算),并可能返回陈旧数据(会话中的查询比 DB 上的查询更旧)。我仅在同一视图上使用相同查询时才使用 QoQ,而不是在整个会话时间跨度内使用。

于 2012-07-13T17:41:08.483 回答
2

可行的?是的,这取决于有多少用户以及它在内存中存储了多少数据,这可能比再次访问数据库要好得多。

似乎获得所需单条记录的最佳方法是查询查询。在 CF 中,您可以创建另一个使用现有查询作为数据源的查询。它看起来像这样:

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

请注意,如果您使用的是 CFBuilder,它可能会因为没有数据源而向您发出错误,这是 CFBuilder 中的一个错误,如果您的 DBType 是“查询”,则不需要数据源

于 2012-07-13T17:27:13.237 回答
1

根据记录的数量,我要做的是将详细数据存储在应用程序范围内,作为以 ID 为键的结构。就像是:

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

那么您实际上只需要按需查询项目的 ID。

为了改进“按需”查询,您至少有两个“in code”选项: 1. 查询查询,您查询整个项目集合一次,然后从中查询您需要的数据。2. Verity 或 SOLR 索引所有内容,然后您只需在刷新搜索集合时查询所有内容。这比为每个查询执行所有连接要快很多

于 2012-07-13T18:33:43.550 回答