【问题标题】:Mysql 查询修改以获得最佳性能
【发布时间】:2022-01-23 12:48:13
【问题描述】:

我在 MySQL 查询中使用 Round() 函数来获得具有 3 精度的 SUM() 值。但我不确定这是否是最好的方法或获得实际值并在 java 或 js 中四舍五入。 我有点困惑,哪个是最佳做法,为什么?

Select ROUND(SUM(ORDER_VALUE),3) from Orders

   Select SUM(ORDER_VALUE) from Orders  group by STOCK_ID:

after that 

   DecimalFormat formatter = new DecimalFormat("0.000");
   System.out.println(formatter.format(25.0)); 

【问题讨论】:

  • 在java端进一步处理从MySQL接收到的数据是否需要取整值?在 MySQL 查询中进行舍入。还是仅显示此数据?显示控件属性时的格式(不是圆形!),或者,如果显示时没有任何控件,则在 Java 代码中。
  • 在这两种情况下是否有任何性能变化?
  • 性能没有差异。每个行集一个舍入?它的开销远低于测量精度 - 没有机会检测到。
  • 非常感谢,不像每行集的舍入,使用分组依据,所以例如舍入将应用于 2000 行数据集中的 100 行
  • 如果您的行集产生 100 行,那么 ROUND() 将被应用 200 次 - 在 MySQL 和 Java 中都是如此。并且相信——MySQL 会更有效地做到这一点,因为值处理是它的业务。 MySQL 中的微小舍入函数可用于在 Java 中使用几乎相同的舍入函数创建额外的对象。

标签: java mysql sql performance query-optimization


【解决方案1】:
SELECT SUM(ROUND(ORDER_VALUE,3)) FROM Orders

【讨论】:

  • Was - 对整个数据集进行四舍五入。变成 - 数据集的每一行都进行一次舍入。
  • 并且结果值可能会更好。业务逻辑需要哪个值?
【解决方案2】:

您想知道是在 MySQL 中还是在您的应用程序中进行四舍五入到小数点后三位更好。

只要 SQL 语句包含SUM(ORDER_VALUE),就没有关系,至少就准确性而言。在舍入之前,SUM() 操作使用它所操作的列的精度。

而且,您的选择之间的性能差异太小而无法衡量。远小于一微秒。

因此,问题在于尽可能使您的代码清晰,并且易于推理。你在处理别人的钱,你希望能够说服自己你做对了。

当未来的客户询问精度的第四位和第五位发生了什么变化时,您希望给出一个简短而正确的答案。

您和一年后的未来自己以及您的同事是否更容易阅读 SQL 中的 ROUND 或 Java 中的字符串格式化内容?

我倾向于将业务规则放在代码中的一个位置。 SQL SUM 是一个业务规则,所以ROUND 应该与之配套。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多