准备好的声明与存储过程

时间:2008-10-13 03:41:50

标签: php mysql stored-procedures prepared-statement

如果您使用的是php5和mysql5,那么在准备好的语句中使用存储过程是否有很大的优势? (我读到某处你可能无法从mysql5存储过程获得实质性的性能提升)

7 个答案:

答案 0 :(得分:28)

它们实际上不是一回事 - 使用存储过程,数据库逻辑驻留在数据库中。准备好的语句基本上避免在多次调用查询时重新解析查询 - 性能优势可能会有很大差异。

使用其中一种的选择实际上取决于您的具体情况。我不再使用存储过程,因为我喜欢在一个地方拥有所有逻辑。

答案 1 :(得分:25)

存储过程对您的专业级(IE企业级)应用程序有意义:

  1. 希望允许数据库工程师优化查询性能
  2. 想要将查询的复杂性抽象为简单的API
  3. 希望您的逻辑分发,因为数据库中发生的某些事情可能是您不想向其他方公开的知识产权
  4. 希望你的逻辑分布,因为这是分布式,n层计算的本质
  5. 您可能希望数据库工程师或DBA修改架构而不修改应用程序代码(存储过程,通过提供API,提供一层抽象)
  6. 还有其他原因。

    准备好的陈述更适合在会话中完成的工作。但是如果你花时间创建一个准备好的语句,你基本上已经完成了创建存储过程所需的一切。不同之处在于存储过程可在多个会话中使用(受数据库中的GRANTS限制)。

    我无法弄清楚的是,如果你有存储过程与准备好的声明的选项,为什么你会打扰准备好的陈述。大多数SP与PS的讨论似乎都关注它们之间的差异,而不是为什么要使用一个与另一个。这似乎总是归结为“取决于你想要做什么。”但我还没有看到一个组织良好的描述:如果你需要VS使用一个proc,如果你需要,可以使用一个声明......

答案 2 :(得分:10)

存储过程的一些优点:

  • 语言之间的便携式
  • 可以简化界面,有时可以提高性能 复杂的查询,尤其是多查询 交易(测试!)
  • 通过暴露界面而不是 表,可以用来改进 安全和诚信

存储过程的一些缺点:

  • 将业务逻辑放入数据库中 - 使设计变得复杂,需要追踪额外的位置 版本控制和故障排除
  • 一些人的绩效损失 情况(测试!)
  • 数据库之间的便携性

我认为这个问题不存在单一的通用答案,因为根据情况有利有弊。如果您遵循简单,干燥,测试和避免过早优化等原则,您可能会很好。

答案 3 :(得分:4)

可能不是这种情况或者值得在这里提及,但是在它们与语言无关的情况下,存储过程也是“可移植的”。您可以像使用PHP一样从Java内部调用数据库中的相同存储过程。因为这些过程驻留在数据库中,所以有权访问数据库的任何东西都可以用同样的方式查询它们。

答案 4 :(得分:2)

存储过程的实质优势在于,在将逻辑应用于它之前,您的数据不会跨越图层(在这种情况下,它将是PHP / MySQL层)。有些查询可能需要多个select语句,这些语句通过PHP比在MySQL中慢。

现在,正如tobyhede指出的那样,将所有逻辑放在一个地方是件好事。但是我参与过那些使用PHP查询所需数据简直不切实际的项目;它必须通过存储过程来完成。

答案 5 :(得分:2)

我将首先说我不喜欢存储过程的想法,我宁愿去准备好的语句路由。在这种特殊情况下,我认为你也在比较苹果和橙子......它们都在那里完全填充不同的功能......

如果应用程序是95%数据库驱动的话,我只考虑存储过程,那么在db中有一些逻辑是否有意义。

答案 6 :(得分:0)

不熟悉php,但通常存储过程已经“编译”,因此可能会比sql语句产生更快的性能。

虽然我的偏好通常是从代码管理/部署和单元测试的角度来看SQL。