当您只进行一次选择时,使用准备好的Select语句会更好吗?

时间:2009-03-22 23:08:53

标签: php sql pdo prepared-statement

我目前正在使用PDO在PHP中编写CRUD类。

我喜欢准备语句提供的安全性,但我听说他们也阻止像mysql这样的数据库使用queryCache。

当您一次只进行一次选择时,使用准备好的Select语句会更好吗?或者只是$ pdo-> quote()就足够了安全观点(或者还有其他任何优点,比如缓存?)。

我所有的更新,删除和插入都是使用预准备语句完成的。我对选择感到好奇。

6 个答案:

答案 0 :(得分:13)

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

  

我做了一个简单的基准测试(使用   SysBench)看表现简单   查询(单行点选择)使用   标准声明,准备好的声明   并从查询缓存中提供服务。   准备好的陈述给出2290   查询/秒显着   优于2000标准   声明,但它仍然低于   结果是4470查询/秒   从查询缓存中提供。

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

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

对于查询缓存,过去确实准备好的语句与缓存查询结果不兼容,但这已经改变了。请参阅MySQL文档中的“How the Query Cache Operates”:

  

在MySQL 5.1.17之前,准备好了   语句不使用查询缓存。   从5.1.17开始,准备好了   语句使用查询缓存   某些条件,有所不同   取决于制备方法:...

文档继续描述这些条件。去读吧。

我建议为SELECT查询使用预准备语句。如果一致地执行变量,在将变量插入到SQL语句中时引用变量会很有效。但即便引用也可能存在一些微妙的安全漏洞,例如:使用多字节字符集(参见MySQL bug#8378)。在这些情况下,以安全的方式使用准备好的查询会更容易。

答案 1 :(得分:2)

是的,使用准备好的陈述。我严重怀疑你会遇到性能问题,准备好的语句运行速度比常规文字查询慢得多。但是,在mysql上,你似乎是正确的。不过,我会选择准备好的陈述。

这是一个参考: http://www.mysqlperformanceblog.com/2006/08/02/mysql-prepared-statements/

虽然,如果您担心缓存,可能需要查看memcached之类的内容。

答案 2 :(得分:1)

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

  

正常查询被视为单个查询   字符串,解析,执行和   回。故事结局。准备好了   声明被视为模板   字符串,解析和缓存。然后呢   几乎有变量传递给它   就像一个函数调用。

     

缓存查询一次往往会花费成本   不仅仅是执行它   直行。节省后来会有所收获   当你跳过编译时调用   步。你保存每次重复查询   汇编数量。

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

答案 3 :(得分:1)

准备好的陈述通常被认为是更好的做法。

我建议阅读准备好的陈述中的MySql article及其相对于传统普通插值字符串查询的实用性和优势。

答案 4 :(得分:1)

您是仅在应用程序生命周期中选择“一次”,还是每次调用该函数时“一次”?

因为如果是后者,你仍然应该从预备语句中的缓存中受益。

答案 5 :(得分:0)

提醒一下MySQL> 5.1.17 does use预准备语句的查询缓存。

从代码POV中,我相信准备好的陈述在很大程度上是可读性,可维护性等方面......

不使用它们的一个原因是以某种频率调用的昂贵查询。 (查询需要花费大量时间才能运行,并且对查询缓存有实际好处)。