AWS RDS MySQL 8.0预处理语句比普通查询慢100倍以上求助
以下是针对该异常现象的具体排查点:
SQL_MODE会话级差异:预处理语句与直接执行查询可能使用不同的会话级SQL_MODE,若预处理会话开启了
ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES等严格模式,可能导致优化器生成低效执行计划。可分别在预处理前后和直接执行时执行SELECT @@SESSION.sql_mode;对比配置差异。预处理语句缓存异常:MySQL 8.0的预处理缓存可能存在失效或错误缓存的情况,可执行
FLUSH PREPARED_STATEMENTS;清空缓存后重新测试。同时检查table_definition_cache、prepared_stmt_count参数值,确保缓存空间充足。RDS专属参数配置问题:AWS RDS的自定义参数组可能限制了预处理语句的性能,比如
optimizer_switch中关闭了derived_merge、index_merge等优化开关,或join_buffer_size、sort_buffer_size等内存参数在预处理会话中被异常调低。可通过SHOW VARIABLES LIKE '%optimizer_switch%';查看优化器配置,对比直接执行与预处理会话的变量差异。元数据锁(MDL)阻塞:预处理语句在解析阶段可能长时间持有MDL锁,若此时表存在DDL操作或其他锁等待,会导致执行停滞。执行
SHOW ENGINE INNODB STATUS;查看锁等待详情,确认是否存在MDL锁冲突。字符集/校对规则不匹配:即使语句无参数,若预处理会话的
character_set_client、collation_connection与表的字符集校对规则不一致,可能触发额外的字符转换操作,拖慢执行速度。执行SHOW CREATE TABLE customers;和SELECT @@SESSION.character_set_client, @@SESSION.collation_connection;对比配置。特定版本性能bug:部分MySQL 8.0早期版本存在预处理语句的优化器bug,导致无法生成最优执行计划。可查看AWS RDS的版本更新日志,尝试升级到8.0.36及以上的稳定版本测试。
内容的提问来源于stack exchange,提问作者Martijn

