MySQL准备语句明显慢于查询

MySQL prepared statement significantly slower than query

提问人:Martijn 提问时间:9/14/2023 更新时间:9/14/2023 访问量:54

问:

我遇到了一个奇怪的情况,即在 AWS RDS MySQL 8.0 实例上运行任何准备好的语句都比手动运行完全相同的查询慢得多(> 100 倍)。

例如

PREPARE stmt1 FROM "select * from customers";
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

select * from customers;

在本例中,它们都很快,但是对于作为查询运行 ~10 秒的查询,相同的预准备语句很容易运行超过一个小时。

事实上,我可以复制慢速准备语句的 SQL,将其作为查询运行,获取结果,返回进程列表,仍然看到准备好的语句正在运行。SHOW PROCESSLIST

这适用于任何预准备语句,无论变量的数量如何,也无论使用何种客户端。

任何想法可能导致这种奇怪的行为吗?

sql mysql 准备语句

评论

0赞 Wilson Hauck 9/14/2023
@Martjin 请查看此 URL 内容。- mysqltutorial.org/mysql-prepared-statement.aspx - 您可能需要在语句周围使用单引号而不是“。做好准备。然后执行,然后解除分配语句名称。
0赞 Wilson Hauck 9/17/2023
请发布有关需要 ~ 10 秒的查询以及用于准备、执行和解除分配的代码的类似信息。
0赞 Wilson Hauck 9/17/2023
大多数人不会在单个进程 ID 中执行 PREPARE、EXECUTE 和 DEALLOCATE 操作。
0赞 Martijn 9/22/2023
事实证明,准备好的语句在查询的一小部分中命中了一个完全错误的索引,导致它从运行大约 10 秒激增到运行超过 60,000 秒。我知道准备好的语句可以计算不同的执行计划,但不能达到这种程度。通过使用索引提示修复了它。
0赞 Wilson Hauck 9/22/2023
恭喜并感谢您使用索引提示的解决方案。您是否在准备的查询中使用了“FORCE INDEX”?

答: 暂无答案