小编典典

我应该在PHP PERFORMANCE-WISE中为MySQL使用准备好的语句吗?

mysql

我了解MySQL中准备好的语句的安全性好处。无需在此讨论该主题。我想知道他们的性能方面。

现在,我知道在单个PHP脚本中使用预准备语句的查询执行两次时,它会更快,因为该查询仅被解析一次,每个查询一次。客户端进行一次准备旅行,然后使用二进制协议发送两次数据。二进制协议更快,而且您不必再解析第二遍。

但是,如果我只想在一个PHP脚本中执行一次查询,该怎么办?使用准备好的语句似乎更糟,因为您要两次访问服务器,一次准备,一次发送数据。只需解析一次的好处就丢失了,第二次旅行将对您不利。如果数据的二进制格式不够小,那么您会使用准备好的语句丢失数据,对吗?

但是,我读了一些关于PHP的mysqli或PDO库做什么的矛盾报告。它们中的任何一个是否在脚本执行期间缓存准备好的语句?服务器是否必须在随后的页面加载中再次解析准备好的语句?如果答案是否定的,那么就不必在第二个页面加载中解析该语句,那么即使每个页面加载仅执行一次查询,似乎预备语句也更好。

请考虑与此有关的MySQL版本之间是否有任何更改。您可以放心地假设我正在使用PHP 5.2

编辑:为了明确起见,我想要一个专门针对MySQL和PHP的答案,指定MySQL版本,如果这曾经有所不同,则仅考虑性能,而不是易用性或安全性。

更新:我接受了我的回答,因为后续评论提出了一些好主意。我仍然有些失望,似乎没有人能够确定地回答我提出的实际问题的症结所在。我猜有时候答案确实是“取决于情况”。


阅读 265

收藏
2020-05-17

共1个答案

小编典典

历史沿革

这是我的第一个Stackoverflow答案。此后发生了很多变化,特别是mysql API的弃用和删除。即使您仍在使用php
5.6,也不应该使用mysql_ * api。现在,PDO或mysqli是唯一可供选择的选项。由于许多原因,PDO更好。

是否在页面加载中缓存了准备好的语句?

我读过一些关于PHP的mysqli或PDO库做什么的矛盾报告。它们中的任何一个是否在脚本执行期间缓存准备好的语句?

两次页面加载之间不会使用相同的预处理语句。它必须每次准备。如果每隔一毫秒压缩一次,那么存储过程可能是一个好主意(假设您有一个复杂的查询)。

对于大插入量(数千行),可以通过将数据转储到文本文件中并使用LOAD DATA IN FILE加载来获得更大的提升。它比一系列插入要快得多。

原始答案

问题的真相是,有时mysqli更快,而其他时候mysql
api更快。但是差异确实很小。如果您查看网络上的任何性能测试,则差异实际上只有10到20毫秒。提高性能的最好方法是优化表设计。

许多“证明”较旧的api更快地方便地进行的测试忘记了为了最大程度的安全性,应为查询中使用的每个变量调用mysql_real_escape_string()。

当且仅当查询中使用的所有表上的数据保持不变时,查询才会被服务器缓存。

等待另一个实际数字更新

2020-05-17