【问题标题】:Data Calculations MySQL vs Python数据计算 MySQL vs Python
【发布时间】:2013-08-18 16:46:31
【问题描述】:

我正在尝试了解以下哪个是更好的选择:

  1. 使用 Python 从 MySQL 查询的输出中计算数据。
  2. 在查询本身中执行计算。

例如,查询返回 20 行和 10 列。 在 Python 中,我计算某些列的差异或除法。

在查询中还是在 Python 中这样做更好?

【问题讨论】:

    标签: python mysql query-performance sql-tuning query-tuning


    【解决方案1】:

    这可能是一个品味问题,但是......

    ...为了给你一个与 Alma Do Mundo 完全相反的答案,对于在SELECT ... 子句上进行的(不是那么)简单的计算,我通常会推动使用数据库“作为一个计算器”。

    计算(在SELECT ... 子句中)是执行查询时的最后一步。此时仅使用相关数据。所有“大工作”都已经完成(处理JOIN、where 子句、聚合、排序)。

    此时,对数据执行一些算术运算的额外负载确实很小。这将减少您的应用程序和数据库服务器之间的网络流量。

    这可能是一个品味问题......

    【讨论】:

    • 如何减少网络流量?从数据库传输到应用服务器的数据实际上会增加,因为在查询中执行的计算意味着额外的列数和额外的数据。
    • @Ravi 也许我没抓住重点,但是,比如说,要计算两列的总和,我用SELECT a+b 而不是SELECT a,b,在宿主语言上执行加法,我减少了网络流量减少了近 50%。
    • 同意。我的回答基于常见情况(例如ORDER BY RAND() 这样讨厌的事情)
    【解决方案2】:

    如果您正在对连续的计算进行基本算术运算,请在 SQL 中执行。这使您可以选择将结果封装在视图或存储过程中。在许多数据库中,它还提供了并行执行语句的可能性(尽管数据行很少,性能不是问题)。

    如果你在 MySQL 中的行之间进行操作(例如获取列的最大值),那么平衡会更加均匀。大多数数据库支持这些计算的简单函数,但 MySQL 不支持。查询的复杂性增加了在客户端执行这些计算的权重。

    在我看来,最重要的考虑是代码的可维护性。通过使用数据库,您必须将业务规则合并到数据库本身中(例如,哪些实体与哪些其他实体相关)。维护代码的一个主要问题是业务逻辑在各种系统中传播。我更喜欢这种逻辑尽可能精简的方法,在不同层之间创建非常清晰的 API。

    对于这种方法,对数据库的“读取”访问将通过视图进行。您正在谈论的逻辑将进入视图并可供数据库的任何用户使用——确保使用数据库的不同功能之间的一致性。 “写”访问将通过存储过程进行,确保一致地检查业务规则并正确记录操作。

    【讨论】:

    • 我不确定将结果封装在视图中的好处是否符合我的情况。这些表经常更新,据我目前所了解的,视图在这种情况下并不是特别有用。这可能是我对您的陈述的误解,但是您所说的 MySQL 不支持 MAX 等的简单函数是什么意思...... MySQL 确实支持这些操作吗?
    • @Ravi 即使在 MySQL 支持 聚合函数 中,它也缺少 window functions。您可以“轻松”模拟它们,但会增加复杂性和执行时间成本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2014-05-26
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多