是否有任何类型的服务器端优化(如在MySQL数据库中)允许一个用户准备好的查询从另一个用户先前准备的查询中受益? (这里的重点是用户之间可能的性能改进,每个查询在单独的php脚本中运行。)
示例:
查询用户1:SELECT * FROM SomeTable WHERE item1 =?和item2 =?
第1项= x 第2项= y
查询用户2:SELECT * FROM SomeTable WHERE item1 =?和item2 =? (与上述相同的查询)
第1项= y 第2项= z
如果这个相同的准备好的查询(虽然每次都有不同的参数)只对这些不同的用户执行一次,那么使用准备好的查询是否有任何潜在的性能提升?
或者在项目1和2上使用real_escape_string函数会更好,并将它们直接放入查询中。这样可以避免两次访问数据库,一次检查准备好的查询的有效性,另一次实际执行查询。
我并不担心SQL注入,因为通过适当的转义,任何一种方法都应该是安全的。 (对吧?)老实说,如果我没有在同一个php脚本中多次迭代执行相同的准备好的查询,我真的只是想知道是否值得使用预处理语句。
谢谢!
答案 0 :(得分:1)
你总是可以调用一个存储过程 - 它只是一个调用:)
drop procedure if exists get_user;
delimiter #
create procedure get_user
(
in p_user_id int unsigned
)
proc_main:begin
select u.* from users u where u.user_id = p_user_id;
end proc_main#
delimiter ;
call get_user(1);
call get_user(3);
call get_user(6);
答案 1 :(得分:1)
这取决于您使用的MySQL版本。查看此页面:http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html 如果您在5.1.17之前使用MySQL,则不会缓存预准备语句,并且使用MySQL查询缓存比使用预准备语句提供更好的结果,因此您最好担心是否在使用此缓存优化的方式与否。 否则,我认为你的问题的答案是肯定的,因为而不是两次这样做:
你会这样做:
准备:
执行第一系列参数:
执行另一系列参数: 1.要求执行标识符 执行 3.返回结果
(所有这些都来自this french course on prepared statements) 如您所见,如果符合以下条件,您将获得真正的性能提升:
答案 2 :(得分:0)
这里的问题是你的两个实例不能共享任何代码(不需要花费太多精力)。准备两次查询应该可以忽略不计。如果存在实际性能瓶颈,问题可能就是其他问题。