Php 准备语句与存储过程

Php 准备语句与存储过程,php,mysql,stored-procedures,prepared-statement,Php,Mysql,Stored Procedures,Prepared Statement,如果您使用的是php5和mysql5,那么使用存储过程是否比使用准备好的语句有很大的优势?(我在某个地方读到,您可能无法从mysql5存储过程中获得实质性的性能提升)不熟悉php,但一般来说,存储过程已经“编译”,因此可能比sql语句产生更快的性能 尽管我通常倾向于从代码管理/部署和单元测试的角度坚持使用SQL 它们实际上并不是一回事——对于存储过程,您的数据库逻辑驻留在数据库中。如果查询被多次调用,预处理语句基本上可以避免重新解析查询——性能优势可能会有很大差异 选择使用其中一种取决于您的具体

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

不熟悉php,但一般来说,存储过程已经“编译”,因此可能比sql语句产生更快的性能


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

它们实际上并不是一回事——对于存储过程,您的数据库逻辑驻留在数据库中。如果查询被多次调用,预处理语句基本上可以避免重新解析查询——性能优势可能会有很大差异


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

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


现在,正如所指出的,将所有逻辑放在一个地方是很好的。但是我曾经在一些项目中工作过,使用PHP查询所需数据是不现实的;它必须通过一个存储过程来完成。

这里可能不是这样,也不值得一提,但是存储过程在语言不可知的情况下也是“可移植的”。您可以在数据库中调用与PHP相同的存储过程,比如Java。由于过程驻留在数据库中,因此任何具有数据库访问权限的对象都可以以相同的方式查询它们。

存储过程的一些优点:

  • 语言间可移植
  • 可以说简化了接口,有时还提高了性能 复杂查询,尤其是多查询 事务(测试!)
  • 通过公开接口而不是 表,可用于改进 安全和完整性
存储过程的一些缺点:

  • 将业务逻辑放入数据库-使设计复杂化,增加了跟踪的空间 版本控制和故障排除
  • 某些行业的业绩损失 情境(测试!)
  • 数据库之间的可移植性较差

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

我首先要说,我不喜欢存储过程的想法,我宁愿选择预先准备好的语句。在这个特殊的例子中,我想你也在比较苹果和橙子……它们都是用来填满不同的功能的


我只考虑存储过程,如果应用程序是95%数据库驱动的,那么在DB中有一些逻辑是有意义的。p> 存储过程适用于专业级(即企业级)应用程序,您可以:

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

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


    我不明白的是,如果您可以选择存储过程与准备语句,那么为什么您要为准备语句而烦恼。大多数SP与PS的讨论似乎都集中在它们之间的区别上,而不是为什么要使用一个与另一个。这似乎总是归结为“取决于你正在尝试做什么”。但我没有看到一个组织良好的描述:如果你需要,使用proc;如果你需要,使用语句……

    。我看到这个问题就挠头。实际上,您可能需要这两种方法:准备好对存储过程的调用。就个人而言,不使用prepare是一种死亡愿望。您需要以某种方式清理数据。存储过程可以使用准备好的语句。无论是否使用存储过程,都应该使用准备好的语句。