当前位置: 首页 > 面试题库 >

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

夏侯和韵
2023-03-14
问题内容

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

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

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

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

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

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

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


问题答案:

历史沿革

这是我的第一个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()。

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

等待另一个实际数字更新



 类似资料:
  • 问题内容: 我使用准备好的语句编写了select语句。每次尝试运行时都会出现此错误。我如何克服这个错误?我的jdbc连接器是mysql-connector- java-5.1.13-bin.jar。我的代码: 错误代码.. 2013年10月1日,下午1:23:23 sanin.lands.model.View_ads_cls getAdDetail 问题答案: 错误在这一行 这样做

  • 问题内容: 在mysqli准备好的语句中,NULL变成’‘(对于字符串)或0(对于整数)。我想将其存储为真正的NULL。有什么办法吗? 问题答案: 我知道这是一个旧线程,但是可以将真实的NULL值绑定到准备好的语句(请阅读this)。 实际上,您可以使用mysqli_bind_parameter将NULL值传递给数据库。只需创建一个变量并将NULL值(请参见手册页)存储到该变量并将其绑定即可。无论

  • 我正在使用我生成的一个准备好的语句,但在Java抛出的语句上出现了语法错误。然而,当我将PS的toString复制并粘贴到数据库的phpmyadmin中时,它的执行完美无缺。有什么想法会出错吗,我很难理解? 编辑:更改为PS.ExecuteUpdate(查询);还是不起作用。

  • 使用PHP和MySQLi,我有一个简单的表单,其中包含4个HTML 5下拉列表输入。现在想知道我是否仍然必须使用Prepared语句来保护我的数据库?我是否仍有SQL注入问题的风险?或者使用此类输入是否存在任何其他类型的风险。谢谢

  • 问题内容: 我正在使用准备好的语句来执行mysql数据库查询。我想实现基于各种关键字的搜索功能。 为此,我需要使用关键字,我知道很多。而且我之前也使用过预处理语句,但是我不知道如何使用它,因为从以下代码中,我将在哪里添加? 我可以直接在as 或类似的东西中使用它吗?我在网络上看到很多帖子,但是在任何地方都没有好的答案。 问题答案: 您需要在值本身中而不是在准备好的语句SQL字符串中进行设置。 因此