mysql性能中的PDO

Posted

技术标签:

【中文标题】mysql性能中的PDO【英文标题】:PDO in mysql performance 【发布时间】:2011-01-26 20:41:33 【问题描述】:

最近我浏览了一篇博客,注意到一些关于在 mysql 中使用 PDO 的观点,它改变了我对 PDO 的看法。 要点是:

    原生预处理语句无法利用查询缓存,导致性能下降。

    本机准备好的语句无法执行某些类型的查询,例如“SHOW TABLES”

    本机准备好的语句无法正确传达某些其他“SHOW”查询的列长度,导致结果出现乱码。

    使用本机准备好的语句多次调用存储过程会导致连接断开。

有人可以对此发表评论吗?

我想在我的网络应用程序中缓存查询。在考虑了我的网站的性能问题后,我正准备移动我的网络应用程序以使用 PDO。 谁能给我推荐一下?

提前致谢。

【问题讨论】:

您应该添加指向该博客的链接,我认为该链接是this。作者澄清说:“当我在 2006 年写这篇文章时,是的,这是真的”和“我不知道这个问题后来是否得到了解决——我希望几年后会这样。”当有人指出第一点是错误的。因此,下面接受的答案现在可能不再适用。 【参考方案1】:

第一点你是对的 SHOW 和 SHOW TABLES 是大多数用例中不常用的命令 我正在将准备好的语句与存储过程结合使用,但尚未遇到此类问题。

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

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

此命令仅适用于 php 5.1.3。

【讨论】:

【参考方案2】:

Prepared statements 确实使用查询缓存,但它确实有条件:

http://bugs.mysql.com/bug.php?id=735 http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html http://dev.mysql.com/doc/refman/5.5/en/query-cache-operation.html

来自 5.1 文档:

在 MySQL 5.1.17 之前,prepared statements 不使用查询缓存。从 5.1.17 开始,prepared statements 在某些条件下使用查询缓存,这取决于准备方法:

使用 mysql_stmt_prepare() 和 mysql_stmt_execute() 使用二进制协议发出的语句。 使用 PREPARE 和 EXECUTE 使用文本(非二进制)协议发出的语句。请参阅第 12.6 节,“预处理语句的 SQL 语法”。

5.5 文档重述如下:

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

【讨论】:

"在 MySQL 5.1.17 之前,prepared statements 不使用查询缓存。从 5.1.17 开始,prepared statements 在某些条件下使用查询缓存,这取决于准备方法:.. . 使用 mysql_stmt_prepare() 和 mysql_stmt_execute() 使用二进制协议发出的语句" @thomasrutter - 引用文档而不是链接到它的好主意。我添加了文档以提供更多帮助 该文本下方还有一些限定条件 - 例如,缓存是在扩展“?”之后完成的参数,根据您是使用 PREPARE 和 EXECUTE 还是使用 API 函数 prepare() 等,有几点需要注意。

以上是关于mysql性能中的PDO的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中的低查询性能

提高 MySQL 中的 count() 性能

MySQL 中的视图性能

mysql性能中的PDO

MySQL 中的复合主键性能缺陷

MySQL 中的 UNION ALL 性能不佳