如何缓存来自存储过程的动态查询?现在我已经创建了这样的存储过程:
CREATE PROCEDURE usp_MyProcedure (
IN UserID INT,
....
)
BEGIN
SET @sqlQuery = CONCAT("SELECT Name From Users WHERE UserID > ", UserID, " AND UserID IN ( SELECT UserID FROM OtherTable WHERE UserID = ", UserID, " ) Order by Name")
PREPARE stmt FROM @sqlQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
但是这种查询不会被缓存。因此,每次有更多时间执行/处理查询。
现在我尝试了其他一些方法,例如:
CREATE PROCEDURE usp_MyProcedure (
IN UserID INT,
....
)
BEGIN
SET @UserID = UserID;
SET @sqlQuery = "SELECT Name From Users WHERE UserID > ? AND UserID IN ( SELECT UserID FROM OtherTable WHERE UserID = ? ) Order by Name";
PREPARE stmt FROM @sqlQuery;
EXECUTE stmt @UserID, @UserID; -- here i passed same variable twice.
DEALLOCATE PREPARE stmt;
END;
在上述情况下,我必须传递相同的变量 (@UserID) 两次,因为它在我的查询中使用了 2 次。但是这项工作在长时间或复杂的查询中非常忙碌。那么,我该如何避免呢?
我尝试的另一种方法如下:
CREATE PROCEDURE usp_MyProcedure (
IN UserID INT,
....
)
BEGIN
SET @UserID = UserID;
SET @sqlQuery = "SELECT Name From Users WHERE UserID > @UserID AND UserID IN ( SELECT UserID FROM OtherTable WHERE UserID = @UserID ) Order by Name";
PREPARE stmt FROM @sqlQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
但是上面的查询再次没有缓存。所以,执行时间很长。并且声明为会话全局变量的这种类型的变量可能与另一个存储过程的变量发生冲突。因为我在此存储过程中调用了存储过程,并且变量名称在另一个存储过程中应该相同。
所以,让我知道什么是最好的解决方案。
谢谢。