2009-10-16 50 views
1

存儲過程我剛纔已轉換SQL select語句到存儲過程中MySQL的 - 不使用查詢緩存

的使用SQL語句select語句耗時 0.4784s來運行

後第一次和0.0003s

存儲過程每次運行需要0.4784秒。

我想查詢緩存沒有被使用

我如何糾正呢?

代碼的簡化版本

SELECT * FROM Venues WHERE VenueName = :TheVenue 

=======

CREATE PROCEDURE GetVenues 
(
    TheVenue VarChar(22) 
) 
BEGIN 
    SELECT * FROM Venues WHERE VenueName = TheVenue 
END; 

回答

2

歡迎使用MySQL ...在存儲過程中獲取任何內容以利用查詢緩存非常困難。 dev文章A Practical Look at the MySQL Query Cache詳細討論了這一點。參考文件hereMySQL Performance Blog中也提到了這些限制。

基本上,不要依賴於在存儲過程內執行的查詢的緩存。儘管the first reference確實聲稱它是可能的,但幾乎不可能得到它的工作。如果您使用存儲過程來封裝複雜的邏輯,這通常不是問題。我所見過的大多數問題都是因爲使用存儲過程進行非常簡單的查詢而導致的,其中VIEW已足夠。

2

你可以嘗試動態SQL存儲過程,如:

CREATE PROCEDURE GetVenues (TheVenue varchar(22)) 
BEGIN 
SET @s = 'SELECT * FROM Venues WHERE VenueName = ?'; 
SET @v = TheVenue; 
PREPARE stmt1 FROM @s; 
EXECUTE stmt1 USING @v; 
DEALLOCATE PREPARE stmt1; 
END; 

無MySQL服務器手工測試語法,所以你可能需要調整它。