我目前正在使用PDO在PHP中编写CRUD类。
我喜欢准备语句提供的安全性,但我听说他们也阻止像mysql这样的数据库使用queryCache。
当您一次只进行一次选择时,使用准备好的Select语句会更好吗?或者只是$ pdo-> quote()就足够了安全观点(或者还有其他任何优点,比如缓存?)。
我所有的更新,删除和插入都是使用预准备语句完成的。我对选择感到好奇。
答案 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中,我相信准备好的陈述在很大程度上是可读性,可维护性等方面......
不使用它们的一个原因是以某种频率调用的昂贵查询。 (查询需要花费大量时间才能运行,并且对查询缓存有实际好处)。