2014-09-13 92 views
0

我已经存储了所有创建基于颜色,重量和质量的产品所需的所有属性的排列和组合,并将其存储在属性表中。如何提高具有多个Where条件和Order By的查询的速度?

在程序中,循环访问此表中的数据并创建Select sql以基于属性查询包含Product Price的另一个表,并将其存储在第三个表中。

我假设在属性表中有7000条记录,在价格表中有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 

价格表红我店 - 深红,橙红等

但是我的属性有红色bcoz红色是主色,在市场上你不完美红色。 所以我给产品接近红色,在那个红色组中更便宜。

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; 
+0

是颜色,质量,重量和OurPrice所有索引? – 2014-09-13 03:03:59

回答

0

报价:“程序循环,以7000个记录和每一个选择SQL查询2Lakh记录”

这使得它听起来像你正在处理RBAR(行到痛苦的排),和运行7,000个查询。

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

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

对于成千上万的查询执行,无论您运行实际查询的效率如何高,语句处理开销都可能占总耗用时间的很大一部分。

(这是完全可能的,我误解你说什么。)

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

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

为了提高性能,如果您正在执行7,000个查询,请重新设计设计,以便将所有7000行作为一个集合处理。一个返回结果的查询很可能会更有效率。

0

直到我们知道确切的方案和您正在努力达到的目标之后,才能给出准确的解决方案。

一般的反应是......

试图将其转换成一组基于查询..,如果你需要不能在一个查询进行输出,再想到一个循环,但仍与一套。机会会有极少数的循环..

根据您的答案有可能是自连接的可能性,这将是比快循环..

或者你可能要退一步想想的数据模型。 ..

最后,如果在数据库级别无法完成...在middletier中获取数据,按照需要处理并将输出放在表格中。我确信此选项比在数据库级别..我没有这种经验。