Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当您只执行一个Select时,使用准备好的Select语句是否更好?_Php_Sql_Pdo_Prepared Statement - Fatal编程技术网

Php 当您只执行一个Select时,使用准备好的Select语句是否更好?

Php 当您只执行一个Select时,使用准备好的Select语句是否更好?,php,sql,pdo,prepared-statement,Php,Sql,Pdo,Prepared Statement,我目前正在使用PDO用PHP编写一个CRUD类 我喜欢prepared语句所提供的安全性,但我听说它们也阻止mysql之类的数据库使用queryCache 当您一次只执行一个Select时,使用准备好的Select语句是否更好?或者仅仅$pdo->quote()就足以满足安全性的观点(或者有任何其他优势,比如缓存?) 我所有的更新、删除和插入都已经使用准备好的语句完成了。我只是对选择感兴趣。是的,使用准备好的语句。我严重怀疑,如果准备好的语句运行速度比普通的文本查询慢得多,您将遇到性能问题。然而

我目前正在使用PDO用PHP编写一个CRUD类

我喜欢prepared语句所提供的安全性,但我听说它们也阻止mysql之类的数据库使用queryCache

当您一次只执行一个Select时,使用准备好的Select语句是否更好?或者仅仅$pdo->quote()就足以满足安全性的观点(或者有任何其他优势,比如缓存?)


我所有的更新、删除和插入都已经使用准备好的语句完成了。我只是对选择感兴趣。

是的,使用准备好的语句。我严重怀疑,如果准备好的语句运行速度比普通的文本查询慢得多,您将遇到性能问题。然而,在mysql上,您似乎是正确的。尽管如此,我还是会选择准备好的声明

这里有一个参考:


尽管如此,如果您担心缓存问题,您可能希望了解以下内容。

这是我的理解,正如以下讨论所证实的:

普通查询被视为单个查询 字符串、已解析、已执行和 返回。故事结束了。准备好的 语句作为模板 字符串、解析和缓存。那么 几乎所有的变量都传递到它了吗 就像函数调用一样

缓存查询一次往往会花费大量时间 不仅仅是执行它 直的储蓄迟来 跳过编译时调用 步每次重复查询时保存 汇编的数量


因此,简而言之,在MySQL上,如果只执行一次查询,准备它只会增加不必要的额外处理量。

准备语句通常被认为是更好的做法


我建议阅读预先准备好的语句及其相对于传统的普通插值严格查询的实用性和优势。

您是在应用程序生命周期中只执行一次select“once”,还是每次调用函数都执行一次select


因为如果是后者,您仍然应该从prepared语句中的缓存中获益。

只是提醒您,MySQL>5.1.17将为prepared语句提供查询缓存

从代码的角度来看,我相信准备好的语句在很大程度上是可读性、可维护性等方面的发展方向


不使用它们的一个原因是昂贵的查询会被频繁调用。(需要花费大量时间运行的查询,并且在查询缓存上有真正的好处)。

MySQLPerformanceBlog.com在一篇关于“Peter Zaitsev”的文章中做了一些基准测试:

我已经做了一个简单的基准测试(使用 SysBench)来查看simple的性能 使用查询(单行点选择) 标准报表 并从查询缓存中获取服务。 准备好的声明给出2290条 查询/秒,这是非常重要的 超过2000个标准 声明,但仍远低于预期 查询结果时每秒4470次查询 从查询缓存服务

这似乎表明,使用预处理语句的“开销”是它们比使用直接查询执行快14.5%,至少在这个简单的测试中是这样。相对差异可能随着更复杂的查询或更大的结果集而减小

考虑到服务器的双向往返和其他因素,准备好的查询会更快,这似乎与直觉相反。彼得的基准缺乏细节。无论如何,您应该运行自己的测试,因为您运行的查询类型、环境和硬件都是非常重要的因素

至于查询缓存,在过去,准备好的语句确实与缓存查询结果不兼容,但这一点有所改变。请参阅MySQL文档中的“”:

MySQL 5.1.17之前,已准备好 语句不使用查询缓存。 从5.1.17开始,准备好 语句使用下面的查询缓存 某些不同的条件 根据制备方法:

文档接着描述了这些条件。去读吧


我建议对
SELECT
查询使用准备好的语句。在将变量插值到SQL语句中时引用变量是有效的,如果您始终如一地这样做的话。但即使是引用也可能存在一些微妙的安全漏洞,例如多字节字符集(请参见MySQL bug)。在这些情况下,以安全的方式使用准备好的查询更容易。

这纯粹是为了确保消防安全?因为它看起来比我想象的还要有更多的性能下降。我认为安全是足够的理由。性能问题,我认为是MySQL中的一个bug。对于dbms抽象层来说,准备好的语句几乎已经成为了最佳实践。这是因为服务器有两次往返,这会降低只执行一次的简单查询的速度。在这种情况下,必须决定是否值得权衡。在这种常见情况下,似乎不太清楚什么是更好的做法。为什么不,准备好的声明在内部遵循一个最佳实践工作流(希望如此),虽然它可能有缺陷并且可以同时被利用,但它将“通常”导致更好的编码实践,并减少引入人为错误的可能性。我确实说过“一般”一次“每次调用函数。如果从每个调用生成的模板不同,那么这将如何工作?有时它们有限制、连接和where子句,有时则没有。如果每次调用都重写模板,它们仍将被缓存?@未知:否。MySQL查询缓存是一个缓存的结果集,由生成该结果的查询字符串键入。如果您完全更改了查询,例如,即使对空格或括号进行了微不足道的更改