在数据数组上运行时PDO是否比mysql_ *快得多?

时间:2014-03-05 21:54:01

标签: php mysql pdo

我最近将我的想法从mysql_ *升级为PDO,我有一个简单的问题:

在一个execute循环中使用预准备语句和for-each比在mysql中使用多个值的单个调用更快,PDO真的更有效吗?

例如,如果我有一个包含5个名称的数组,将这些名称放在execute命令中,在'{1}}循环中运行'insert'预处理语句 - 调用这5次会更快在计算速度上,一个调用使用旧的mysql与单个查询中的所有5个值?或者仅仅因为安全而不是速度而受到欢迎?

2 个答案:

答案 0 :(得分:4)

原生预备陈述(您称之为“PDO”)的含义和意义被所有人忽视和误判。

速度的好处,每个人都在谈论这么多,实际上可以实现极为罕见,而且往往不明显。 尤其是在PDO所属的PHP的Web开发领域 另请注意,无论速度优势属于仅查询解析 - 没有诸如索引重建或查找要更新的记录所需的时间受预准备语句影响。

所以,谈到像五个这样的数字,不要为这个“曾经准备多次执行”的事情烦恼。它不是PDO的意思。 PDO做了两个必要的事情,这使得它优先于其他两个可能的扩展:

  • 它通常支持预准备语句,允许查询中的数据不是直接但通过占位符。这是您应该使用PDO或类似lib的唯一原因(尽管您可以轻松地使旧的mysql ext支持预准备语句,但PDO提供了开箱即用的功能)
  • 它使得这种支持不像mysqli那样痛苦

回到你的问题:

  1. 您可以使用自己喜欢的任何一种方式。请记住,由于现代数据库引擎的默认设置,多个插入最好包含在事务中
  2. 无论您选择哪种方式,任何动态值都应添加到查询仅通过占位符。如果您仍然不相信,欢迎您阅读article I wrote on the matter (which is still incomplete, but have a through explanation on the real meaning of prepared statements)
  3. PS。本机预处理语句还有一个小好处,经常被遗忘(很少需要) - 如果使用了本机预处理语句(并由msqlnd驱动程序支持),则返回的数据已根据其类型进行格式化。

答案 1 :(得分:2)

一个获取5行的查询可能比5次单独调用更快,因此您要比较苹果和橙子。

执行相同的查询时,性能也会类似。 PDO具有的(小)性能优势是具有参数的查询应该更好地可缓存。查询客户3和客户5时,查询将缓存为两个不同的查询,而只有ID不同。通过使用参数,数据库可以以更智能的方式缓存查询,因此使用不同输入的第二次调用不需要通过查询优化器等。

也就是说,除了性能优势之外,PDO也更安全(实际使用paramteres时),并且最终更容易。一开始看起来可能看起来更复杂,但做得更容易,因为不使用参数,你需要自己做所有的逃避,冒着危险的bug。

顺便说一句,您还可以使用可变数量的参数构建查询,并在循环中将值绑定到每个参数,因此使用PDO您仍然可以执行5行的单个插入查询,尽管它会需要一点令人费解和一些额外的代码。