我有一个包含以下列的表:
ItemCode VARCHAR
PriceA DECIMAL(10,4)
PriceB DECIMAL(10,4)
这张table大约有1000行。
我的要求是检查差异( PriceA-PriceB
)然后显示价格差异最大的前50个项目。
有两种方法可以实现这一点
1) 相信sql计算不复杂、简单且快速,因此我运行以下查询:
SELECT ItemCode, (PriceA - PriceB) AS PDiff FROM testtable ORDER BY PDiff DESC LIMIT 50
其次,
2) 再添加一列(称为 PriceDiff
),它将存储差异( PriceA-PriceB
).
但是,这些必须手动插入,并且需要额外的空间。但它可以简单地运行 MAX(PriceDiff)
选择查询前50名。
我的问题是——就web应用程序(在网站/应用程序上显示结果)的速度和效率而言,上面哪种方法更好?
我试图为每个查询生成所消耗的时间,但两个都报告了相似的数据,因此无法做出任何推断。
Maven们的任何解释,或者对代码的任何微调,都将非常感激。
谢谢
2条答案
按热度按时间iszxjhcz1#
一般来说,为了提高性能,您必须在内存和时间之间进行权衡。缓存结果会提高速度,但是会占用更多内存。您可以通过以牺牲性能为代价动态计算内容来减少内存使用。
在您的例子中,在db中存储额外的1000+个值只需要几个额外的kb。动态计算差异对性能的影响可以忽略不计。任何一个选项对任何数据库和服务器来说都是微不足道的。
我会坚持做计算的飞行,因为这是不太复杂,并保持正常化的数据库。
ibrsph3r2#
如前所述,第一种方法速度最快,但容易出错。
我可以建议另一种解决方案,使用主键。然后,您可以将新列的值设置为您试图从web应用程序中得到的值。
然后,当你想知道前50名的时候,你可以用你原来的方法找到前50名,用你的第二种方法,从存储差异的表中选择。这些链接解释了主键以及如何使用它们:
http://www.mysqltutorial.org/mysql-primary-key/
https://www.w3schools.com/sql/sql_primarykey.asp