索引失效的几种场景

简介: 在数据库SQL优化中,百分之80%的问题SQL都可以通过索引来解决,但是有时候我们也会碰到一种情况,明明索引都有,为什么MySQL没有选择走索引而是走了全表扫描呢?近期就碰到一个案例,同大家分析一个当时的解决思路以及对索引失效的几种情况总结一下~

    在数据库SQL优化中,百分之80%的问题SQL都可以通过索引来解决,但是有时候我们也会碰到一种情况,明明索引都有,为什么MySQL没有选择走索引而是走了全表扫描呢?近期就碰到一个案例,同大家分析一个当时的解决思路以及对索引失效的几种情况总结一下~

一、告警发现

    在一个风和丽日的下午,突然一条高亮的钉钉信息抖动在为眼前。【尊敬的用户xxx,您的数据库实例rm-aabbcc,有告警产生:MySQL CPU使用率>= 90, now is 99.0,请及时处理。】呐尼!数据库CPU报警了!!!

二、问题排查

    1、不管三七二十一,接收到报警信息的第一反应都是立马登录阿里云控制管理台,去抓问题现场!登上去后可以看到数据库会话已经出现了堆积,所有SQL的执行时间都比较长,且全部在Sending data的状态。
_


    2、SQL执行效率很差,抓取其中一条SQL,登录数据库查看执行计划,查看慢究竟慢在了哪里,另外建议开发同学排查该SQL属于哪块儿业务,同时我们对SQL执行计划进行分析:
_


    从这个执行计划中我们可以一眼看到问题,p表与s表关联是本可以走s表的主键索引,但是却选择走了全表扫描,MySQL为什么会这样做呢?MySQL为什么会认为走ALL的效率会很好??我们可以通过force index来强制SQL走主键索引,看SQL效率是否有提升。
_
_
_


    通过force index强制SQL走主键索引进行关联后,SQL执行效率提升显著。所以,MySQL此时默认的执行计划是错误的。所以我们想要解决这个问题,必然要分析清楚为什么索引会失效。


    3、表的字符集格式以及排序方式一致,排除隐式转换导致的索引失效。继续往后面看,发现spu表的table_rows为0???排查到这里问题原因基本找到,spu表的统计信息有误导致MySQL执行计划选择错误。建议业务方先把堆积的SQLkill掉缓解数据库的压力。
_


    当数据库负载降下来后,我们再次核实一下我们的猜想是否正确,实际上该表有50w的数据量,但是统计信息却是0,所以误导MySQL认为走ALL的效率也是很快的,而SQL实际执行下来扫描数据量很大,SQL执行效率极差。
_

三、问题处理

    表数据量不大,数据库当前负载也不高,建议直接analyze table tbl_name来重新统计表信息。
_


    重新统计表信息后,我们再次观察统计信息和执行计划,spu的table_rows进行了更正,且执行计划在不加force的情况下选择走了主键索引进行表关联,SQL执行效率恢复正常。
_
_

四、总结

    以上是整个问题排查以及处理的流程,那么究竟什么情况会导致索引失效呢?我这边大致想到了三种情况:
1、使用函数

where date(create_at) = '2019-01-01'

2、表关联字符集格式以及排序方式不一致

1.关注CHARSET和COLLATION
2.SQL写法错误导致的索引失效比较常见的例子是,我们存储手机号的字段格式为varchar,但是SQL却写的where phone=123;

3、统计信息不准确

本案例
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
关系型数据库 MySQL Linux
Linux安装部署MySQL5.7(企业常用版)超详细1
Linux安装部署MySQL5.7(企业常用版)超详细
1114 0
Linux安装部署MySQL5.7(企业常用版)超详细1
|
存储 数据可视化 前端开发
低代码数据可视化GoView项目的初体验
低代码数据可视化GoView项目的初体验
|
人工智能 NoSQL 测试技术
Apipost 与 Apifox:全栈工程师视角下的 API 工具抉择
本文对比了Apipost与Apifox两款API工具在AI能力、数据一致性管理、自动化测试、团队协作、协议支持、数据库支持及离线可用性等多个核心维度的表现。Apipost凭借AI智能化、数据自动同步、全面协议支持及离线功能等优势,在大型项目、高安全场景及多协议调试中表现更出色。而Apifox适合预算有限、小型团队及纯HTTP项目。
406 0
|
4月前
|
JSON 供应链 API
企业级实战:1688 图搜接口(item_search_img / 拍立淘) 接入方法
1688图搜API(item_search_img/拍立淘)支持以图搜货,传入图片URL或Base64,返回同款/相似B2B商品(含offerId、价格、起批量等)。含官方入口、完整参数、签名规则、Python调用示例、接入步骤及避坑指南,开箱即用。
|
测试技术
【LaTex】10 从md文件导入\导出word (因为:Typora-版本过高不能转换word 报错:Unknown option --atx-headers. )
【LaTex】10 从md文件导入\导出word (因为:Typora-版本过高不能转换word 报错:Unknown option --atx-headers. )
1223 7
|
网络协议 Java 应用服务中间件
centos7环境下tomcat8的安装与配置
本文介绍了在Linux环境下安装和配置Tomcat 8的详细步骤。首先,通过无网络条件下的文件交互软件(如Xftp 6或MobaXterm)下载并解压Tomcat安装包至指定路径,启动Tomcat服务并测试访问。接着,修改Tomcat端口号以避免冲突,并部署Java Web应用项目至Tomcat服务器。最后,调整Linux防火墙规则,确保外部可以正常访问部署的应用。关键步骤包括关闭或配置防火墙、添加必要的端口规则,确保Tomcat服务稳定运行。
|
智能硬件
搭建Home Assistant智能家居系统 - 随时随地控制你的家庭设备「内网穿透」(三)
搭建Home Assistant智能家居系统 - 随时随地控制你的家庭设备「内网穿透」
947 0
|
SQL 分布式计算 Hadoop
【赵渝强老师】Hadoop生态圈组件
本文介绍了Hadoop生态圈的主要组件及其关系,包括HDFS、HBase、MapReduce与Yarn、Hive与Pig、Sqoop与Flume、ZooKeeper和HUE。每个组件的功能和作用都进行了简要说明,帮助读者更好地理解Hadoop生态系统。文中还附有图表和视频讲解,以便更直观地展示这些组件的交互方式。
1189 5
|
IDE Java 测试技术
Java“非法的表达式开头"是什么原因引起的,怎么解决
“非法的表达式开头”通常是由于在Java代码中错误地放置了表达式或语法错误导致的。例如,在应该是一个语句的地方写了一个表达式,或者在表达式内部出现了不正确的结构。解决方法是检查并修正相关语法错误,确保表达式的正确性和位置适当性。检查括号是否配对完整,以及变量声明、运算符使用是否符合规范也是必要的步骤。
1376 7
|
人工智能 算法
林鸣晖:户外广告价值回归,技术驱动下的品效协同新范式
2025年,户外广告在技术驱动下迎来价值重构。阿里云瓴羊通过AI赋能,深入剖析行业四大趋势,推动户外营销向智能、全域、协同升级,助力品牌抢占用户心智,构建新生态。
648 0