Php 命名参数、缓存和PDO

Php 命名参数、缓存和PDO,php,sql,mysql,pdo,Php,Sql,Mysql,Pdo,如果我有这样的参数化SQL语句: SELECT * FROM table WHERE my_field = :field_value 是否有人知道PDO是否会将其识别为相同的SQL语句并使用缓存,而不是假设它是完全不同的SQL语句: SELECT * FROM table WHERE my_field = :new_field_value 因此,我想问题是:如果参数化select语句中的参数名称发生了更改,但其他内容没有更改,那么我是否仍能获得缓存的性能优势?或者我必须确保参数名称保持不变吗

如果我有这样的参数化SQL语句:

SELECT * FROM table WHERE my_field = :field_value
是否有人知道PDO是否会将其识别为相同的SQL语句并使用缓存,而不是假设它是完全不同的SQL语句:

SELECT * FROM table WHERE my_field = :new_field_value

因此,我想问题是:如果参数化select语句中的参数名称发生了更改,但其他内容没有更改,那么我是否仍能获得缓存的性能优势?或者我必须确保参数名称保持不变吗?

它应该被识别为相同的语句,因为缓存是在查询参数被值替换后完成的

它应该被识别为相同的语句,因为缓存是在查询参数被值替换后完成的

PDO没有缓存-MySql是这样的。是的,它会将最终查询缓存在查询缓存中。不仅如此,如果您多次使用相同的预处理语句,您将获得额外的速度提升,因为MySql可以缓存该语句的查询执行计划。

PDO没有缓存—MySql有。是的,它会将最终查询缓存在查询缓存中。不仅如此,如果您多次使用相同的预处理语句,您将获得额外的速度提升,因为MySql可以缓存该语句的查询执行计划。

如果您使用PDO_MySql,它会在服务器看到预处理语句之前将预处理语句自己重写为原始SQL,除非将PDO::ATTR\u EMULATE\u PREPARES设置为false。

如果您使用的是PDO\u MySQL,它会在服务器看到准备好的语句之前将它们自己重写为原始SQL,除非您将PDO::ATTR\u EMULATE\u PREPARES设置为false。

我不确定PDO如何处理命名参数,但如果它使用MySQL prepared语句,则需要使用MySQL 5.1.17或更高版本才能使用查询缓存

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


我不确定PDO如何处理命名参数,但如果它使用MySQL准备的语句,那么如果希望使用查询缓存,则需要使用MySQL 5.1.17或更高版本

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


选择*总是让我不寒而栗:-选择*总是让我不寒而栗:-这难道不意味着在使用带有默认属性的PDO时,参数化对性能没有任何好处吗?@Karim:是的,差不多。默认设置是为了使它能够与MySQL 4.x一起工作。在没有性能提升的情况下,PDO的重写器有很多缺陷,不能很好地处理边缘情况。在我学会关闭它之前,它多次破坏了我的代码。你有支持这一点的链接吗?该手册说它利用了mysql 4.1或更高版本中的原生语句。我会被诅咒的…即使在php5.4上使用mysqlnd和最新的mysql版本,PDO::ATTR_EMULATE_PREPARES在默认情况下是打开的,我的常规查询日志也不会显示准备好的语句,除非我关闭模拟。这难道不意味着在使用带有默认属性的PDO时,参数化对性能没有任何好处吗?@Karim:Yes,差不多。默认设置是为了使它能够与MySQL 4.x一起工作。在没有性能提升的情况下,PDO的重写器有很多缺陷,不能很好地处理边缘情况。在我学会关闭它之前,它多次破坏了我的代码。你有支持这一点的链接吗?该手册说它利用了mysql 4.1或更高版本中的原生语句。我会被诅咒的…即使在php5.4上使用mysqlnd和最新的mysql版本,PDO::ATTR_EMULATE_PREPARES在默认情况下是打开的,我的常规查询日志不会显示准备好的语句,除非我关闭模拟。那么,你是说我使用什么名称作为参数无关紧要?只要查询的语法相同,我就能得到缓存的好处吗?不,您需要保留准备好的语句,以便重新使用它。但是您可以多次调用它,每次绑定不同的值,并从中获得一点好处。那么您是说我使用什么名称作为参数并不重要吗?只要查询的语法相同,我就能得到缓存的好处吗?不,您需要保留准备好的语句,以便重新使用它。但是您可以多次调用它,每次绑定不同的值,并从中获得一些好处。哦,好的。我的印象是参数化对性能很有用,因为缓存可以在不担心作为查询一部分的实际值的情况下完成。但听起来你好像在说缓存是用给定的值完成的。哦,好的。我的印象是参数化对性能很有用,因为缓存可以在不担心实际va的情况下完成 属于查询一部分的LUE。但听起来好像是说缓存是用给定的值完成的。