如何提高具有多个Where条件和Order By的查询的速度?

时间:2014-09-13 02:18:36

标签: php mysql sql sql-server loops

我已根据颜色,重量和质量存储了创建产品所需的所有属性的所有排列和组合,并将其存储在属性表中。

在程序中,我循环该表中的数据并创建Select sql以查询另一个包含基于属性的产品价格的表,并将其存储在第三个表中。

我假设属性表中有7000条记录,Price表中有2条Lakh记录。 因此程序循环到7000条记录,每条选择SQL查询2Lakh记录。

选择SQL包含多个Where子句和按价格排序以获得最低价格。

我的问题是如何减少查询执行时间。

示例: -

属性表

sno  color      Quality  Weight
1      blue     Good       3kg
2      red      Fair        1kg   
3      Yellow   Excellent   1.5Kg

价格表

sno     color     Quality    Weight(in kgs)    Market Price  Our Price 
1      sky blue    Good       4                 $400           $360
2      orange red  Excellent  2                 $500           $450

价格表对于Red I商店 - 深红色,橙红色等。

但属性我有红色bcoz红色是Prime颜色,在市场上你没有得到完美的红色。 因此,我将产品接近红色并且在该红色组中更便宜。

select * from tbl_price 
where color IN {Array [tbl data Entry i.e. RED ]    gives-> ( "Crimson Red", "Orange Red","Carrot Red" )}
AND Quality IN {Array [tbl data Entry i.e. Good ] gives-> ("Above Average","Medium","Not Bad" )}
AND Weight >= {tbl Entry of Weight}
Order by OurPrice ASC
LIMIT 1,1;

2 个答案:

答案 0 :(得分:0)

引用:“程序循环到7000条记录,每条选择SQL查询2Lakh记录”

这使得它听起来像是在处理RBAR(逐行),并运行7,000个查询。

将行作为一个集处理,通常效率更高(在SQL中),并运行一个返回所需结果集的查询。

与发出SQL语句相关的开销(客户端发送SQL文本,服务器解析文本,执行语法检查,执行语义检查,选择执行计划,然后执行计划,准备结果集,将结果返回到客户。)

有了数千个查询执行,无论您运行实际查询的效率如何,语句处理开销都是总耗用时间的重要部分。

(我完全有可能误解了你所说的话。)

奇怪的是,您的示例查询显示了LIMIT 1,1子句。这是“跳过”结果集中的第一行。这看起来有点奇怪,因为你说你想要获得“最低”价格,而不是第二低价格。

使用MySQL,您可以使用EXPLAIN查看执行计划;这可能会提供对性能问题的洞察力。有时,添加适当的索引可能会显着提高性能。但是,在这种情况下,如果您尝试改进的查询是在搜索包含两行的表,那么任何索引都不太可能在性能上产生任何差异。

最重要的是,为了提高性能,如果要执行7,000个查询,请重新设计设计,以便将所有7,000行作为一组处理。返回结果的单个查询可能会更有效。

答案 1 :(得分:0)

在我们了解具体情况以及您要实现的目标之前,很难给出准确的解决方案。

一般反应是......

尝试在基于集合的查询中转换它..,如果您需要的输出无法在一个集合查询中完成,那么请考虑一个循环,但仍然使用一个集合。可能很少有人循环......

根据你的回答,可能会有一个自连接的可能性比循环更快..

或者你可能不得不退后一步思考数据模型......

最后,如果无法在数据库级别完成任务,那么在middletier中获取数据,处理并根据需要将输出放在表中。我确信这个选项比在DB级别做的更好。我几乎没有这样的经历。