【问题标题】:MySQL Parameterized Queries - Cache Duration [duplicate]MySQL参数化查询-缓存持续时间[重复]
【发布时间】:2012-12-20 02:45:43
【问题描述】:

可能重复:
Are prepared statements cached server-side across multiple page loads with PHP?

我正在开发一个新项目并首次使用参数化查询(PHP 与 MySQL DB)。我读到他们参数化的查询被缓存了,但我想知道它们被缓存了多长时间。例如,假设我有一个函数“getAllUsers()”,它从用户表中获取所有活动用户 ID 的列表,并且对于每个 ID,创建一个用户对象并且对函数“getUser($user)”的调用是用于设置对象的其他属性。 'getUser()' 函数有它自己准备好的查询,函数末尾有一个 stmt->close()。

如果我这样做,我在“getUser()”中的参数化查询是否完全利用了缓存,还是在每次 stmt->close() 之后从缓存中销毁查询?

注意:如果页面只需要单个用户对象的数据,我也会使用 getUser() 函数,所以我想这样做以确保如果用户表发生更改,我只需要更新一个查询。

这是做这种事情的正确方法还是有更好的方法?

更新:有趣,刚刚在 php.net 的准备语句手册上看到了这个 (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)

使用准备好的语句并不总是执行语句的最有效方式。与未准备好的语句相比,只执行一次的准备好的语句会导致更多的客户端-服务器往返。

所以我想参数化查询的主要好处是防止 SQL 注入,而不一定要加快速度,除非它是一次重复的查询。

【问题讨论】:

  • 好的,在阅读了其他内容后,我看到很多人说我不应该使用 stmt->free_result() 或 stmt->close() 除非它是一个消耗的长脚本很多内存,这是真的吗,我应该不使用它们吗?
  • @JasonMcCreary,这不是同一个问题。这是如果我想在一个页面上显示用户列表(或其他任何内容),该页面有一个查询 getAllUsers() 以选择所有 ID,然后在该函数中多次调用函数 getUser()。所以这一切都发生在一个页面加载中。
  • 你能定义“缓存”吗?您还可以引用整个“缓存”的一些资料吗? real 数据库中的预处理语句(阅读:不是 MySQL)对预处理语句有一些高级魔法,但我从未见过任何 缓存 因为它们而进行。我预计您要么使用了错误的术语,因此感到困惑,要么一直在阅读声名狼藉的东西,因此感到困惑。

标签: php caching mysqli parameterized-query


【解决方案1】:

致电mysqli_stmt::close 将:

关闭一个准备好的语句。 mysqli_stmt_close() 也会释放 语句句柄。

因此无法使用缓存版本的语句进行进一步的执行。 我不介意释放资源或关闭语句,因为 PHP 会在脚本结束时为您完成。

此外,如果您正在使用循环(如您所述),请查看mysqli_stmt::reset,它将将准备好的语句重置为其原始状态(在准备调用之后)。

【讨论】:

  • 谢谢杰弗里!正是我正在寻找的东西,以及关于 mysqli_stmt::reset 的附加花絮的奖励道具
【解决方案2】:

从某种角度来看,这是个好问题。

首先,关于“缓存”。
准备好的查询有一些特别之处 - 您可以将其发送到服务器一次,然后执行多次。它可以为使用已经解析和准备好的查询提供一些小的理论上的好处。
看起来,您每次都准备查询时并没有使用这种机制。所以,根本没有缓存。

接下来,关于过早优化。
您听说过一些缓存,它占据了您的想象力。
虽然您没有真正需要或理由担心缓存或任何性能问题。

因此,有一条规则:在性能问题真正出现之前,不要让自己陷入困境。
否则你会浪费你的时间。

【讨论】:

  • 所以在我的例子中,我最好将一组用户对象传递给'getUser()'函数(即使它只是一个)并准备语句,然后循环遍历数组,更改每个所需对象的参数?
猜你喜欢
  • 2011-01-25
  • 2011-12-13
  • 2014-02-11
  • 2013-10-29
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多