【发布时间】:2013-08-18 16:46:31
【问题描述】:
我正在尝试了解以下哪个是更好的选择:
- 使用 Python 从 MySQL 查询的输出中计算数据。
- 在查询本身中执行计算。
例如,查询返回 20 行和 10 列。 在 Python 中,我计算某些列的差异或除法。
在查询中还是在 Python 中这样做更好?
【问题讨论】:
标签: python mysql query-performance sql-tuning query-tuning
我正在尝试了解以下哪个是更好的选择:
例如,查询返回 20 行和 10 列。 在 Python 中,我计算某些列的差异或除法。
在查询中还是在 Python 中这样做更好?
【问题讨论】:
标签: python mysql query-performance sql-tuning query-tuning
这可能是一个品味问题,但是......
...为了给你一个与 Alma Do Mundo 完全相反的答案,对于在SELECT ... 子句上进行的(不是那么)简单的计算,我通常会推动使用数据库“作为一个计算器”。
计算(在SELECT ... 子句中)是执行查询时的最后一步。此时仅使用相关数据。所有“大工作”都已经完成(处理JOIN、where 子句、聚合、排序)。
此时,对数据执行一些算术运算的额外负载确实很小。这将减少您的应用程序和数据库服务器之间的网络流量。
这可能是一个品味问题......
【讨论】:
SELECT a+b 而不是SELECT a,b,在宿主语言上执行加法,我减少了网络流量减少了近 50%。
ORDER BY RAND() 这样讨厌的事情)
如果您正在对连续的计算进行基本算术运算,请在 SQL 中执行。这使您可以选择将结果封装在视图或存储过程中。在许多数据库中,它还提供了并行执行语句的可能性(尽管数据行很少,性能不是问题)。
如果你在 MySQL 中的行之间进行操作(例如获取列的最大值),那么平衡会更加均匀。大多数数据库支持这些计算的简单函数,但 MySQL 不支持。查询的复杂性增加了在客户端执行这些计算的权重。
在我看来,最重要的考虑是代码的可维护性。通过使用数据库,您必须将业务规则合并到数据库本身中(例如,哪些实体与哪些其他实体相关)。维护代码的一个主要问题是业务逻辑在各种系统中传播。我更喜欢这种逻辑尽可能精简的方法,在不同层之间创建非常清晰的 API。
对于这种方法,对数据库的“读取”访问将通过视图进行。您正在谈论的逻辑将进入视图并可供数据库的任何用户使用——确保使用数据库的不同功能之间的一致性。 “写”访问将通过存储过程进行,确保一致地检查业务规则并正确记录操作。
【讨论】: