1

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

SELECT * FROM table WHERE my_field = :field_value

有谁知道 PDO 是否会将此(见下文)识别为相同的 SQL 语句并使用缓存而不是假设它是完全不同的 SQL 语句:

SELECT * FROM table WHERE my_field = :new_field_value

所以,我想问题是:如果参数化的选择语句中的参数名称发生了变化,但没有其他任何变化,我仍然可以获得缓存的性能优势吗?还是我必须确保参数名称保持不变?

4

4 回答 4

4

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

于 2008-12-18T17:58:20.010 回答
1

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

于 2008-12-18T13:40:07.487 回答
0

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

于 2008-12-18T17:52:30.817 回答
0

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

MySQL 查询缓存

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

于 2008-12-21T05:53:28.687 回答