0

我正在努力寻找尽可能少的性能影响的最佳方法。

这是设置...

带有搜索优化过滤器的搜索结果页面,该过滤器对 PHP 处理程序进行 AJAX 调用,该处理程序返回一组新的(优化的)结果。

我有 4 个表,其中包含我需要在 PHP 处理程序代码中连接的所有数据。

表 1 - 包含主要详细信息的主记录表

表 2 - 来自专业评级公司 #1 的每种产品的评级

表 3 - 专业评级公司#2 对每种产品的评级

表 4 - 专业评级公司#3 对每种产品的评级

搜索结果页面上的细化器是 jquery 滑块,其范围从允许的最低等级到每个等级的最高等级。

移动滑块句柄时,将使用新值进行新的 AJAX 调用,并且数据库查询将运行以创建一组新的精炼结果。

从表 1 中获取我需要的数据是很容易的部分。我正在努力解决的是如何有效地在其他 3 个表上包含一个连接,并且只选择与优化值/范围匹配的行。表 2、3 和 4 都有多个年份(2004-2012)的列,当我最初尝试将它们全部放入一个查询时,它陷入了困境。

表 2、3 和 4 包含表 1 中每条记录的各种评级。

表 2、3 和 4 中的列是... id - productID - y2004 - y2005 - y2006 - y2007 - ...您明白了。

每一年的每一列都有每条记录的数值(默认为 0)。

我需要做的是一次有效地选择与用户在所有 4 个表中选择的精简范围相匹配的记录。

一个示例精炼搜索将是...从表 1 中获取所有记录,其中价格在 25 美元和 50 美元之间,并且表 2 记录的评级(来自任何年份/列)在 1 - 4 之间,并且表 3 记录的评级(来自任何年份/列)在 80 - 100 之间并且表 4 记录的评级(来自任何年份/列)在 80 - 100 之间。

关于如何以尽可能高的性能进行设置的任何建议?

4

1 回答 1

2

我的建议是使用不同的表结构。您应该将表 2、3 和 4 合并为ratings具有以下结构的单个表:

id | productID | companyID | year | rating

然后你可以将你的查询重写为:

SELECT *
FROM products p
JOIN ratings r ON p.id = r.productID
WHERE p.price BETWEEN 25 AND 50
    AND (
        ( r.companyID = 1 AND r.rating BETWEEN 1 AND 4 )
        OR ( r.companyID = 2 AND r.rating BETWEEN 80 AND 100 )
        OR ( r.companyID = 3 AND r.rating BETWEEN 80 AND 100 )
    )

这样性能肯定会提高。此外,随着年份和公司数量的增加,您的表格将更具可扩展性。

还有一件事:如果products表中有很多字段,执行 2 个查询而不是加入可能更有用。这样做的原因是您正在获取冗余数据 -product即使您只需要一次,每个连接的行都将具有列。这是连接的副作用,并且可能存在一个性能阈值,即查询两次比连接更有用。由您决定是否/何时是这种情况。

于 2012-08-25T19:33:36.790 回答