在MySQL和PHP中进行计算

sil*_*npi 49 php mysql maintainability performance

语境:

  • 我们有一个PHP/MySQL应用程序.
  • 计算的某些部分直接在SQL中完成.例如:过去24小时内创建的所有用户都将通过SQL查询返回(NOW() - 1天)

同事和我之间正在进行辩论,我认为我们应该:

A.将所有计算/代码/逻辑保存在PHP中,并将MySQL视为"哑"信息库

他的意见:

B.根据什么更轻松/更快地进行混合搭配.http://www.onextrapixel.com/2010/06/23/mysql-has-functions-part-5-php-vs-mysql-performance/

我正在考虑可维护性的观点.他正在考虑速度(正如文章指出的那样,MySQL中的某些操作速度更快).


@ bob-the-destroyer @tekretic @OMG Ponies @mu太短了@Tudor Constantin @tandu @Harley

我同意(并且很明显)高效的WHERE子句属于SQL级别.但是,例如:

  1. 使用NOW()计算24个句点 - 在SQL中1天选择在过去24小时内创建的所有用户?
  2. 返回大写的所有用户的名字和姓氏?
  3. 连接字符串?
  4. (想法,伙计?)

清除属于SQL域的示例:

  1. 特定的WHERE选择
  2. 嵌套的SQL语句
  3. 订购/分拣
  4. 选择DISTINCT项目
  5. 计算行/项目

Mol*_*mby 42

我会发挥每个系统的优势.

聚合,加入和过滤逻辑显然属于数据层.它更快,不仅因为大多数数据库引擎都有10年以上的优化,而且还可以最大限度地减少数据库和Web服务器之间的数据转移.

另一方面,我使用的大多数数据库平台在处理单个值时都具有非常差的功能.事情就像日期格式化和字符串操作只是在SQL中吮吸,你最好在PHP中做这项工作.

基本上,使用每个系统来完成它的构建.

在可维护性方面,只要在明确的地方之间进行划分,将这些划分为逻辑类型不应该造成太多问题,当然也不足以超出利益.在我看来,代码的清晰度和可维护性更多地是关于一致性而不是将所有逻辑放在一个地方.


Re:具体例子......

  1. 我知道这不是你所指的,但日期几乎是一个特例.您希望确保系统生成的所有日期都在Web服务器或数据库上创建.如果数据库服务器和网络服务器配置不同的时区(我已经看到这种情况发生),否则会导致一些隐蔽的错误.想象一下,例如,你createdDate有一个默认值的列在DBgetDate()插入时应用.如果您要插入一条记录,那么使用PHP生成的日期(例如,选择在过去一小时内创建的记录,您可能无法得到您期望的结果.至于您应该在哪个层上执行此操作,我更喜欢数据库因为,在示例中,它允许您使用列默认值.date("Y-m-d", time() - 3600)

  2. 对于大多数应用程序,我会在PHP中执行此操作.结合名字和姓氏听起来很简单,直到你意识到你有时也需要称呼,标题和中间姓名首字母.此外,你几乎肯定会在你想要用户名字,姓氏和联合致敬+名字+姓氏的情况下结束.将它们连接在一起DB端意味着你最终会移动更多的数据,尽管它确实很小.

  3. 要看.如上所述,如果您想要单独使用它们,那么最好将性能分别拉出来并在需要时连接.也就是说,除非你处理的数据集很大,否则可能还有其他因素(比如,你提到的,可维护性).

一些经验法则:

  • 生成增量ID应该在DB中发生.
  • 就个人而言,我喜欢DB应用的默认设置.
  • 选择时,任何减少记录数量的内容都应由DB完成.
  • 通常可以做一些减少数据集DB端大小的事情(就像上面的字符串示例一样).
  • 正如你所说; 排序,聚合,子查询,连接等应该始终是DB端.
  • 此外,我们还没有谈到它们,但触发器通常是坏的/必要的.

您在这里面临一些核心权衡取舍,余额实际上取决于您的应用程序.

有些事情应该 - 每次 - 总是在SQL中完成.排除许多任务的一些异常(比如日期事物),SQL可能非常笨重,可以让你在逻辑上不受限制.在代码库中搜索对特定列的引用时(例如),容易遗漏视图或存储过程中包含的内容.

性能始终是一个考虑因素,但取决于您的应用程序和具体示例,可能不是一个大的.您对可维护性的担忧可能非常有效以及我提到的一些性能优势非常轻微,因此请注意过早优化.

此外,如果其他系统直接访问数据库(例如,用于报告或导入/导出),您将从数据库中拥有更多逻辑中受益.例如,如果要直接从其他数据源导入用户,则可以在SQL中实现可重用的电子邮件验证功能.

简答:这取决于.:)


Tud*_*tin 8

我不喜欢重新发明轮子.我也想使用最好的工具来完成需要完成的任务,所以:

  • 当我可以直接从DB获取结果集而无需进一步处理时,我会这样做 - 你的情况是一个带有简单WHERE子句的简单查询.想象一下当你拥有1000万用户并将它们带到PHP时会发生什么,只需要100个 - 你猜对了 - 你的网络服务器很可能会崩溃
  • 当您需要从一次2个或多个表中获取数据,同样,MySQL是比PHP更好
  • 当你需要统计记录时 - 数据库很棒
  • 我倾向于支持应用程序级别处理FK约束
  • 此外,我倾向于避免存储过程,更喜欢在应用程序级别实现该业务逻辑(当然,除非我们讨论的是大型数据集).

总之,我会说你的同事在提出的案件中是正确的

  • 但现在我的笑话毫无意义:( (14认同)
  • 我没有意识到weel是发明的. (6认同)

小智 7

如果你把一半的逻辑放在数据库中,而另一半放在php中,那么当你进行改变时,你需要花费两倍的时间来弄清楚发生了什么.

尽管如此,您的数据库查询应该具有足够的逻辑,以便它们为您的php提供所需的数据.如果你发现自己在PHP代码中循环遍历成千上万的mysql记录,那么你做错了什么.但是,在规模的另一端,如果你在mysql查询中运行if/else语句,你也做错了(可能只需要重写你的查询).

我避开了存储过程.虽然它们在理论上是一个很好的概念,但你通常可以在PHP中以更快的开发时间完成相同的结果,并且你还可以获得知道所有逻辑在哪里的额外好处.


OMG*_*ies 6

随着结果集的增加,MySQL将更好地扩展.坦率地说,将数据库视为"哑数据"存储库是浪费资源......

可维护性往往受到熟悉程度的影响.如果您不熟悉PHP,那么它不是您可维护性的最初选择 - 是吗?