相同查询在不同RDS for MySQL的性能差异

2018-06-29 04:21

  【IT168技术】相同查询在数据量相近的情况下在不同 RDS for MySQL 实例上有不同的性能表现,容易引发用户对 RDS for MySQL 实例的性能差异性的疑虑,本文分享下近期碰到的一个原因比较隐蔽但很常见的案例。

  对比执行计划 A,内层使用的索引是 MySQL 自动创建的(auto_key1),检查优化器开关配置是否有区别,以防万一。

  此时问题就比较明朗了,应该是关联的两个字段类型不匹配,导致无法通过索引物化临时表的关联字段来使用 Nested Loop Join。

  带着的怀疑检查下两个实例的表 Pay 和 inv_msg 的关联字段 PayId 的字段类型。

  可以看到 payId 字段在执行快场景下 2 个表都是 big int 类型;而在执行慢的场景下,2个表的字段类型分别为 big int 和 varchar,导致执行计划选择了对无法使用索引场景优化的 Block Netsted Loop。

  理清问题的根源,就有了针对性的方法。用户修改 表 inv_msg 的字段 payid 类型为 big int not null,重新收集统计信息后问题解决。