2008-12-18 58 views
1

,如果我有一个参数化的SQL语句是这样的:命名参数,缓存和PDO

SELECT * FROM table WHERE my_field = :field_value 

有谁知道,如果PDO将认识到这一点(见下文)相同的SQL语句,并使用高速缓存,而不是假设这是一个完全不同的SQL语句:

SELECT * FROM table WHERE my_field = :new_field_value 

所以,我想的问题是:如果在参数选择语句中的参数的变化,但没有其他的名称更改,将我仍然获得高速缓存的性能优势?或者我必须确保参数名称保持不变?

+2

“SELECT *”总是让我不寒而栗。 :-) – 2008-12-18 13:12:42

回答

4

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

1

,因为高速缓存中的查询参数后进行应认定为相同的语句是由价值观

+0

噢好吧。我认为参数化对性能很有用,因为可以完成缓存而不用担心查询中的实际值。但这听起来像是你说缓存是用给定的值完成的。 – Karim 2008-12-19 14:08:02

0

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

+0

那么你在说,我用什么名字参数并不重要?只要查询的语法是相同的,我获得缓存的好处? – Karim 2008-12-19 14:05:40

+0

不,你需要坚持准备好的声明,重新使用它。但是你可以多次调用它,每次绑定不同的值,并从中获得一些好处。 – troelskn 2008-12-19 17:24:19

0

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

MySQL Query Cache

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