我已根据颜色,重量和质量存储了创建产品所需的所有属性的所有排列和组合,并将其存储在属性表中。
在程序中,我循环该表中的数据并创建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;
答案 0 :(得分:0)
引用:“程序循环到7000条记录,每条选择SQL查询2Lakh记录”
这使得它听起来像是在处理RBAR(逐行),并运行7,000个查询。
将行作为一个集处理,通常效率更高(在SQL中),并运行一个返回所需结果集的查询。
与发出SQL语句相关的开销(客户端发送SQL文本,服务器解析文本,执行语法检查,执行语义检查,选择执行计划,然后执行计划,准备结果集,将结果返回到客户。)
有了数千个查询执行,无论您运行实际查询的效率如何,语句处理开销都是总耗用时间的重要部分。
(我完全有可能误解了你所说的话。)
奇怪的是,您的示例查询显示了LIMIT 1,1
子句。这是“跳过”结果集中的第一行。这看起来有点奇怪,因为你说你想要获得“最低”价格,而不是第二低价格。
使用MySQL,您可以使用EXPLAIN
查看执行计划;这可能会提供对性能问题的洞察力。有时,添加适当的索引可能会显着提高性能。但是,在这种情况下,如果您尝试改进的查询是在搜索包含两行的表,那么任何索引都不太可能在性能上产生任何差异。
最重要的是,为了提高性能,如果要执行7,000个查询,请重新设计设计,以便将所有7,000行作为一组处理。返回结果的单个查询可能会更有效。
答案 1 :(得分:0)
在我们了解具体情况以及您要实现的目标之前,很难给出准确的解决方案。
一般反应是......
尝试在基于集合的查询中转换它..,如果您需要的输出无法在一个集合查询中完成,那么请考虑一个循环,但仍然使用一个集合。可能很少有人循环......
根据你的回答,可能会有一个自连接的可能性比循环更快..
或者你可能不得不退后一步思考数据模型......
最后,如果无法在数据库级别完成任务,那么在middletier中获取数据,处理并根据需要将输出放在表中。我确信这个选项比在DB级别做的更好。我几乎没有这样的经历。