2010-03-12 75 views
5

最近我正在浏览一个博客,并注意到在mysql中使用PDO的一些观点,它改变了我对PDO的看法。 的要点是:在mysql性能上的PDO

  1. 本地预处理语句不能把查询缓存的优势,从而降低了性能。

  2. 本机准备语句不能执行某些码类型的查询,如“SHOW TABLES”

  3. 母语制备语句不正确通信列长度为某些其他的“SHOW”查询,从而产生乱码的结果。

  4. 使用本机预处理语句多次调用存储过程会导致连接中断。

任何人都可以对此发表评论吗?

我想在我的web应用程序查询缓存。考虑到我的网站的性能问题后,我准备移动我的网络应用程序以利用PDO。 任何人都可以请建议我吗?

在此先感谢。

+1

你应该添加链接到我认为是[这个]的博客(http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/)。作者澄清说:“当我在2006年写回这封信时,是的,这是真的”,“我不知道这个问题是否随后得到解决 - 我希望在几年后。”当有人指出第一点是错误的。所以下面接受的答案现在可能不再适用。 – 2011-11-28 16:37:06

回答

5

  • 你是对的第一个点
  • 秀和SHOW表结合使用准备statemends与存储过程中的大多数使用情况不常用
  • 荫命令,并没有但遇到这样的问题。

您可以使用以下命令启用查询缓存:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); 

此命令可以从PHP 5.1.3只。

2

预处理语句一定要使用查询缓存,但它确实具备的条件:

从5.1文档:

Befor e MySQL 5.1.17,预准备语句不使用查询缓存。与5.1.17开始,准备语句使用在某些条件下,其不同取决于制备方法查询缓存:正在使用该二进制协议使用mysql_stmt_prepare()和在mysql_stmt_execute()发出

  • 语句。
  • 使用PREPARE和EXECUTE使用文本(非二进制)协议发布的语句。请参见第12.6节“准备好的语句的SQL语法”。

哪5.5文档重述为:正在使用mysql_stmt_prepare()和在mysql_stmt_execute()使用二进制协议发出

准备语句,都受到关于缓存限制。与查询缓存中的语句比较是基于扩展后的语句文本?参数标记。该语句仅与使用二进制协议执行的其他缓存语句进行比较。也就是说,为了查询缓存目的,使用二进制协议发布的预准备语句与使用文本协议发布的预准备语句不同。

+0

“在MySQL 5.1.17之前,预准备语句不使用查询缓存从5.1.17开始,准备语句在特定条件下使用查询缓存,这取决于准备方法:...使用二进制协议使用mysql_stmt_prepare()和mysql_stmt_execute()“ – thomasrutter 2011-06-24 03:27:28

+0

@thomasrutter - 好主意引用文档而不是链接到它。我已经添加了文档以更有帮助 – SeanDowney 2011-06-24 18:02:53

+0

该文本还有一些限定条件 - 例如,缓存是在扩展“?”后完成的。参数,根据是否使用PREPARE和EXECUTE或者是否使用API​​函数prepare()等,有两件事要注意。 – thomasrutter 2011-06-28 02:57:29