Prepared语句与存储过程


Prepared Statement vs. Stored Procedure

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

它们实际上并不相同——对于存储过程,数据库逻辑驻留在数据库中。如果多次调用Prepared语句,那么它们基本上可以避免重新解析查询——性能优势可能会有很大差异。

使用其中一种或另一种的选择实际上取决于您的具体情况。我不再真正使用存储的proc了,因为我喜欢把所有的逻辑都放在一个地方。

存储过程对于专业级(IE企业级)应用程序来说是有意义的,您可以:

  1. 希望允许您的数据库工程师优化查询以提高性能
  2. 希望将查询的复杂性抽象为简单的API
  3. 希望您的逻辑是分布式的,因为数据库中发生的一些事情可能是您不想向其他方公开的知识产权
  4. 希望您的逻辑是分布式的,因为这是分布式n层计算的本质
  5. 您可能希望数据库工程师或DBA在不修改应用程序代码的情况下修改模式(存储的proc,由于提供了API,因此提供了一层抽象)

还有其他原因。

事先准备好的发言更有利于在一次会议内完成工作。但是,如果您花时间创建一个准备好的语句,那么您基本上已经完成了创建存储过程所需的一切。不同之处在于,存储过程可以跨多个会话使用(取决于数据库中的GRANTS)。

我不能弄清楚的是,如果您可以选择存储过程与准备好的语句,为什么您会使用准备好的声明。大多数SP与PS的讨论似乎都集中在它们之间的差异上,而不是为什么使用其中一个与另一个。这似乎总是可以归结为"取决于你想做什么"。但我还没有看到一个组织良好的描述:如果你需要使用proc,VS如果你需要,使用语句。。。。

存储过程的一些优点:

  • 可在语言之间移植
  • 可以说简化了界面,有时还提高了复杂查询,尤其是多查询事务(测试!)
  • 通过公开接口而不是表,可用于改进安全性和完整性

存储过程的一些缺点:

  • 将业务逻辑放入数据库-使设计复杂化,需要额外的跟踪位置版本控制和故障排除
  • 某些方面的性能损失情况(测试!)
  • 数据库之间的可移植性较差

我不认为这个问题有一个简单的答案,因为根据情况有利弊。如果你遵循简单、DRY、测试和避免过早优化等原则,你很可能会得到好的结果。

可能不是这种情况,也不值得在这里提及,但存储过程在语言不可知的情况下也是"可移植的"。您可以像使用PHP一样,从Java内部对数据库调用相同的存储过程。因为这些过程位于数据库中,所以任何能够访问数据库的程序都可以以相同的方式查询它们。

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

现在,正如托比海德所指出的,把所有的逻辑都放在一个地方是好的。但我曾参与过一些项目,在这些项目中,使用PHP查询所需的数据是不现实的;它必须通过一个存储过程来完成。

我首先要说的是,我不喜欢存储过程的想法,我宁愿走准备好的语句路线。在这种特殊的情况下,我认为你也在比较苹果和橙子。。。它们都是为了充分发挥不同的功能。。。。

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

不熟悉php,但通常存储过程已经"编译"过了,因此与sql语句相比,可能会产生稍快的性能。

尽管我通常倾向于从代码管理/部署和单元测试的角度使用SQL。