云数据库 GAUSSDB(FOR MYSQL)-联合索引设置不当导致慢SQL的解决办法:原因分析
原因分析
- 查看查询变慢对应的时间段中,实例CPU监控指标并无飙升情况且使用率一直都较低,因此排除了CPU冲高导致查询变慢的可能。
图1 CPU使用率
- 分析对应时间段该实例的慢日志,该SQL执行快时其扫描行数为百万级,当SQL执行慢时其扫描行数为千万级,与业务确认该表短期内并无大量数据插入,因此推断执行慢是因为未走索引或选错索引。且通过EXPLAIN查看该SQL的执行计划确实是全表扫描。
图2 慢日志
- 在实例上对该表执行SHOW INDEX FROM检查三个字段的基数,。
图3 查看基数
可知基数最小的字段“query_date”在联合索引的第一位,基数最大的字段“group_id”在联合索引最后一位,而且原SQL包含对“query_date”字段的范围查询,导致当索引走到“query_date”就会停止匹配,后面两个字段已经无序,无法走索引。
所以该SQL本质上只能利用到对“query_date”这一列的索引,而且还有可能因为基数太小,导致优化器成本估计时选择了全表扫描。
业务重新创建了联合索引将“group_id”字段放在第一位,“query_date”字段放在最后一位后,查询耗时符合预期。
- 华为云数据库 RDS for MySQL常见故障排除_华为云
- 云数据库GaussDB(for MySQL)_兼容MySQL
- 云数据库 GaussDB(for MySQL)与RDS for MySQL的区别
- GaussDB(for MySQL)并行查询_GaussDB(for MySQL)内核_GaussDB(for MySQL)并行执行_PQ
- GaussDB监控_GaussDB数据库监控_高斯数据库监控_华为云
- GaussDB分析_GaussDB数据库分析_高斯数据库分析_华为云
- 如何连接测试服务器数据库_mysql数据库磁盘满了怎么办
- GaussDB(for MySQL)规格变更_包周期库扩容_变更CPU_存储扩容
- MySQL数据库_查看MySQL数据库版本_免费MySQL数据库
- RDS for MySQL变更实例的CPU和内存规格_CPU和内存_CPU过高_MySQL内存