是否有任何类型的服务器端优化(如在 MySQL 数据库中)允许一个用户准备好的查询受益于另一个用户先前准备的查询? (这里的重点是用户之间可能的性能改进,每个查询在单独的 php 脚本中运行。)
例子:
查询用户 1:SELECT * FROM SomeTable WHERE item1 = ?和 item2 = ?
项目 1 = x 项目 2 = y
查询用户 2:SELECT * FROM SomeTable WHERE item1 = ?和项目 2 =? (与上面相同的查询)
项目 1 = y 项目 2 = z
如果这个相同的准备好的查询(尽管每次使用不同的参数)只会对每个不同的用户执行一次,那么使用准备好的查询是否有任何潜在的性能提升?
或者对第 1 项和第 2 项使用 real_escape_string 函数,然后将它们直接放入查询中会更好吗?这将避免两次访问数据库,一次检查准备好的查询的有效性,另一次实际执行查询。
我并不完全担心 SQL 注入(inject),因为通过适当的转义,任何一种方法都应该同样安全。 (对吗?)老实说,我只是想知道如果我不在同一个 php 脚本中多次执行同一个准备好的查询,是否值得使用准备好的语句。
谢谢!
最佳答案
这取决于您使用的 MySQL 版本。查看此页面:http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html 如果你使用的是5.1.17之前的MySQL,prepared statements是不会缓存的,使用mysql query cache比使用prepared statements的效果要好,所以你最好担心一下你是不是在使用这个缓存优化方式与否。 否则,我认为您的问题的答案是肯定的,因为不要这样做两次:
- 向服务器发送请求
- 编译请求
- 执行计划
- 执行请求
- 返回结果
你会这样做:
准备:
- 向服务器发送请求
- 编译请求
- 执行计划
- 将编译后的请求存入内存
- 返回一个请求标识符
使用第一系列参数执行:
- 请求使用标识符执行
- 执行
- 返回结果
执行另一系列参数: 1.请求执行标识符 2.执行 3.返回结果
(全部翻译自this french course on prepared statements) 如您所见,如果满足以下条件,您将获得真正的性能提升:
- 你经常执行这个请求
- 请求很复杂,编译需要时间
- 使用查询缓存
关于PHP/MySQL Prepared Statements - 一个用户可以从另一个用户的准备好的查询中获益吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382373/