命名参数,缓存和PDO

时间:2008-12-18 13:07:20

标签: 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语句中发生了变化,但没有其他变化,我仍然可以获得缓存的性能优势吗?或者我是否必须确保参数名称保持不变?

4 个答案:

答案 0 :(得分:4)

如果你正在使用PDO_MySQL,它会在服务器看到之前将预备语句重写为原始SQL,除非你将PDO::ATTR_EMULATE_PREPARES设置为false。

答案 1 :(得分:1)

它应该被识别为相同的语句,因为在用值

替换查询参数之后完成缓存

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

MySQL Query Cache

  

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