2012-08-25 61 views
0

我尽可能少地影响性能,并努力做到这一点。PHP MySQL的操作方法和性能

这里的设置...

搜索与搜索精炼过滤器,使一个AJAX调用返回结果的新(精)设置PHP处理结果页面。

我有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之间。

任何关于如何设置它的性能尽可能?

+0

我们平均在初始搜索中讨论了多少结果?将它们全部加载并使用JS进行过滤可能会更容易 - 使用MySQL跳过这些过滤,使用Javascript完成所有操作。当然,这取决于开始的记录数量,因为您不想让浏览器停滞不前。 – BenOfTheNorth

回答

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的列。这是连接的一个副作用,并且可能存在一个性能阈值,其中查询两次比加入会更有用。这是由你来决定是否/何时是这种情况。

+0

感谢Grampa - 我改变了我的表格结构到你的建议,加载了新的查询,并且一切都很快。谢谢! – Rmilligan2372