2008-12-18 56 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開始,準備好的語句在特定條件下使用查詢緩存,這取決於準備方法: