PHP / MySQL准备语句 - 一个用户可以从另一个用户准备好的查询中受益吗?

时间:2010-12-07 22:38:45

标签: php mysql performance mysqli prepared-statement

是否有任何类型的服务器端优化(如在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脚本中多次迭代执行相同的准备好的查询,我真的只是想知道是否值得使用预处理语句。

谢谢!

3 个答案:

答案 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. 将请求发送到服务器
  2. 编译请求
  3. 执行计划
  4. 执行请求
  5. 发回结果
  6. 你会这样做:

    准备:

    1. 将请求发送到服务器
    2. 编译请求
    3. 执行计划
    4. 将已编译的请求存储在内存中
    5. 返回请求标识符
    6. 执行第一系列参数:

      1. 要求使用标识符执行
      2. 执行
      3. 返回结果
      4. 执行另一系列参数:  1.要求执行标识符  执行  3.返回结果

        (所有这些都来自this french course on prepared statements) 如您所见,如果符合以下条件,您将获得真正的性能提升:

        • 你经常执行这个请求
        • 请求很复杂,需要时间来编译
        • 使用了查询缓存

答案 2 :(得分:0)

这里的问题是你的两个实例不能共享任何代码(不需要花费太多精力)。准备两次查询应该可以忽略不计。如果存在实际性能瓶颈,问题可能就是其他问题。