为了账号安全,请及时绑定邮箱和手机立即绑定

当在代码中作为准备好的语句运行时,MySQL 查询在 PHP 中运行缓慢

当在代码中作为准备好的语句运行时,MySQL 查询在 PHP 中运行缓慢

Go
江户川乱折腾 2023-06-26 17:48:05
我正在尝试调试的 PHP 应用程序在更大的 MySQL 数据库上运行了几个设计不当的查询。有几个页面确实很慢,结果发现是因为一些查询。我开始一一检查每个查询,虽然它们很慢,但它们本身并没有那么慢。经过进一步调试后发现,只有当应用程序将它们作为准备好的语句运行时,它们才会变慢。如果我通过 MySQL 客户端手动运行查询,大约需要 300 毫秒。如果我通过 MySQL 客户端运行创建一条准备好的语句并设置参数并运行它,大约需要 300 毫秒。如果我从 PHP (mysqli) 运行简单查询,大约需要 300 毫秒。如果我像应用程序一样通过mysqli预准备语句运行它,则需要 100 秒。我想也许是这样,mysqli所以我用PDO尝试了一下,结果是一样的。尝试了不同的 PHP 版本(5.6、7.2、7.3)并得到相同的结果。所以我给了最后一次机会,写了一个小的 Go 脚本来测试,我得到了相同的结果,并且事情得到了改进。现在,如果我从 MySQL 客户端或 MySQL Workbench 或 PHPStorms 数据库客户端运行查询的准备语句版本,速度会很快。如果我从代码中运行查询,速度会非常快。任何关于我应该照顾什么、我应该在哪里继续调试的帮助将不胜感激。
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

事实证明,这是由略有不同的执行计划引起的。MySQL似乎纯粹根据语句创建执行计划,不包括通过mysqlior使用预备语句时的参数值PDO,这是有道理的。然而,当它提供完整的查询时,在我们的例子中,它引入了对其中一个表的优化,这产生了巨大的差异。

其中一个表(有 550 万行)Using join buffer (Block Nested Loop)在使用非准备语句运行时有 Extra,而使用准备语句则没有。这似乎为我们带来了近 1000 倍的性能差异。

我仍然不确定为什么这通过 PHPStorm 或 CLImysql客户端没有问题,我最好的猜测是,MySQL 中的某些 API 期望在准备语句时执行计划完成,而其他 API 和 CLI 客户端则不这样做't。


查看完整回答
反对 回复 2023-06-26
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信