PHP/MySQL Prepared Statements - 一个用户可以从另一个用户的准备好的查询中获益吗?

标签 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 = ?和项目 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. 执行计划
  4. 执行请求
  5. 返回结果

你会这样做:

准备:

  1. 向服务器发送请求
  2. 编译请求
  3. 执行计划
  4. 将编译后的请求存入内存
  5. 返回一个请求标识符

使用第一系列参数执行:

  1. 请求使用标识符执行
  2. 执行
  3. 返回结果

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

(全部翻译自this french course on prepared statements) 如您所见,如果满足以下条件,您将获得真正的性能提升:

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

关于PHP/MySQL Prepared Statements - 一个用户可以从另一个用户的准备好的查询中获益吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382373/

相关文章:

MySQL Lat/Lon 半径搜索

visual-studio - 混合硬盘会改进 Visual Studio 编译时间吗?

performance - LINQ 内存不足错误

performance - Perl 创建对象非常慢

javascript - 如何在 iframe 中显示 db 中的 pdf

php - Magento:根据客户群获取产品价格

php - Laravel "Target [Illuminate\Contracts\Bus\Dispatcher] is not instantiable."

mysql - 在MYSQL中连接3个表并过滤

mysql - 选择首先计数或数据以检查自动增量 ID

php - 如何将 netbeans ide 和 wamp 服务器一起用于 php 项目