【问题标题】:Functions in MySQL or PHPMySQL 或 PHP 中的函数
【发布时间】:2008-11-01 20:12:38
【问题描述】:
通常是在网络服务器上运行函数还是在数据库中运行函数更好?
例子:
INSERT INTO example (hash) VALUE (MD5('hello'))
或
INSERT INTO example (hash) VALUE ('5d41402abc4b2a76b9719d911017c592')
好吧,这是一个非常简单的例子,但是当一个站点扩展到多个网站或数据库服务器时,为了实现可扩展性,最好在哪里“完成工作”?
【问题讨论】:
标签:
php
mysql
performance
【解决方案1】:
我尝试将数据库视为仅保存内容的地方,并将所有抽象代码放在其他地方。数据库表达式已经足够复杂,无需向它们添加函数。
此外,如果您最终想要执行诸如“SELECT .... WHERE MD5(xxx) = ...”之类的操作,查询优化器将跳过任何带有函数的表达式
而且数据库函数通常不是很便携。
【解决方案2】:
每当需要这样的计算时,我都会尝试在我的脚本语言中使用函数。出于多种原因,我将 SQL 函数的使用率降至最低。
主要原因是我的一个 SQL 数据库负责托管多个网站。如果 SQL 服务器因来自一个站点的请求而陷入困境,则会对其余站点产生不利影响。例如,如果您在共享服务器上工作,则考虑这一点更为重要,尽管在这种情况下您几乎无法控制其他用户正在做什么。
第二个原因是我希望我的 SQL 代码尽可能地可移植。我什至不想尝试计算存在的不同风格的 SQL,所以我尝试将函数(尤其是非标准扩展)保留在我的 SQL 代码之外,除了 SUM 或最小值/最大值。
我想我的意思是,SQL 旨在存储和检索数据,它应该保持这个目的。使用您选择的服务语言预先执行任何计算,并保持您的 SQL 代码可移植。
【解决方案3】:
就个人而言,我尝试通过插入、更新、删除来保持数据库的简单(最低限度),而无需在代码中使用太多功能。 Stored Proc 也是一样,只包含与持久化数据非常接近的任务,与业务逻辑无关。
我会把 MD5 放在外面。这将让我们在数据库的存储范围之外进行这种“数据操作”。
但是,你的例子很“简单”,我不认为把它放在里面……
【解决方案4】:
使用您的数据库作为持久化和维护数据完整性的手段。并将业务逻辑留在其中。
如果您将业务逻辑(其中任何一个)放入数据库中,您将使其在未来的管理和维护变得更加复杂。
【解决方案5】:
我认为大多数时候,您会希望将数据操作留给网络服务器,但是,如果您想处理与表、关系等有关的数据库,那么就选择数据库。
我正在亲自游说我的公司将我们的 MySQL 服务器升级到 5.0,以便我可以开始利用程序(这会扼杀我们管理的几个网站)。
【解决方案6】:
与目前为止的其他答案一样,我更喜欢将所有业务逻辑放在一个地方。即,我的应用程序语言。 (更具体地说,在对象模型中,如果存在,但并非所有代码都是 OO 的。)
但是,如果您在 StackOverflow 中查找 (my)sql 标记的关于是否使用内联 SQL 或存储过程的问题,您会发现大多数回复这些问题的人都强烈支持在任何时候使用存储过程,并且尽可能,即使是最琐碎的查询。您可能想查看其中一些问题,以了解支持另一种方法的一些论据。