如果我有这样的参数化SQL语句:
SELECT * FROM table WHERE my_field = :field_value
有没有人知道PDO是否会将此识别(见下文)视为相同的SQL语句并使用缓存而不是假设它是完全不同的SQL语句:
SELECT * FROM table WHERE my_field = :new_field_value
所以,我想问题是:如果参数的名称在参数化的select语句中发生了变化,但没有其他变化,我仍然可以获得缓存的性能优势吗?或者我是否必须确保参数名称保持不变?
答案 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 5.1.17之前,预准备语句不使用查询缓存。从5.1.17开始,预准备语句在某些条件下使用查询缓存,这取决于准备方法: