我不是数据库专家,但是我继承了一个相当大的生产MySQL数据库的责任,这个数据库来自一个看起来有点严重不称职的人,但偶尔会有耀眼的光彩。大多数问题我都能够自己解决,但是这个问题让我很难过,而且我还没有看到任何解决它的问题:
有没有理由让一个存储过程只不过是一个预准备语句的包装器?
这些方面的东西:
CREATE PROCEDURE foo_search (IN searchParam1 int, IN searchParam2 varchar(255))
BEGIN
SET @local1 = searchParam1;
SET @local2 = searchParam2;
PREPARE stmt FROM
'...'; --Fairly complex nested select statement
EXECUTE stmt USING @local1, @local2;
END
就是这样。我对准备好的语句的理解是,它们的好处在于清理输入(已经由我们使用的PHP框架处理),并且来回减少通信(在存储过程中受到损害)。
这看起来是纯粹而简单的毫无意义的疯狂,还是我错过了什么?
答案 0 :(得分:0)
可能有。
也许那个人正在使用不支持预处理语句的数据库连接库,所以他只是希望获得相同的效果。
也许他想从触发器调用该存储过程。
答案 1 :(得分:0)
减少网络流量,因为CALL foo_search(searchParam1, searchParam2)
每次发送整个SQL语句的数据会少于数据。
在服务器上准备语句可以提高性能。在对几种不同的方法进行基准测试后,我们发现对于复杂的SQL语句,只准备一次语句, 在服务器上 ,表现最佳。这是一个例子:
CREATE PROCEDURE foo_search (IN searchParam1 int, IN searchParam2 varchar(255))
BEGIN
SET @local1 = searchParam1;
SET @local2 = searchParam2;
IF ISNULL(@foo_search_prepared) THEN
SET @foo_search_prepared = TRUE;
PREPARE stmt FROM
'...'; --Fairly complex nested select statement
END IF;
EXECUTE stmt USING @local1, @local2;
END