索引失效的几种场景

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 在数据库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、统计信息不准确

本案例
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
SQL Oracle 关系型数据库
分析索引失效的几种情况
联合索引 is not null 只要在建立的索引列(不分先后)都会走, in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),或者=一个值; 当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。
101 1
|
6月前
|
SQL Oracle 关系型数据库
索引失效的情况分析
大家都知道,一条查询语句走了索引和没走索引的查询效率是非常大的,在我们建好了表,建好了索引后,但是一些不好的sql会导致我们的索引失效,下面介绍一下索引失效的几种情况
43 0
|
6月前
|
SQL 关系型数据库 MySQL
14. 什么情况下索引会失效 ?
了解 MySQL 索引失效的情况对优化 SQL 查询至关重要。避免在列上使用函数、运算、!=、not in、OR 和 %value% LIKE 操作,以保持索引有效性。使用组合索引代替多个单列索引,防止范围查询后的列无法使用索引。注意,NULL 值、列类型不匹配和隐式转换也可能导致索引失效。
88 0
|
6月前
|
SQL 关系型数据库 MySQL
索引失效的10中场景
索引失效的10中场景
|
存储 关系型数据库 MySQL
Mysql索引失效的几种原因
Mysql索引失效的几种原因
122 0
|
存储 关系型数据库 MySQL
教你优雅的实现索引失效
教你优雅的实现索引失效
88 0
|
关系型数据库 MySQL 索引
索引失效的情况
索引失效的情况
80 0
|
存储 SQL 关系型数据库
Mysql索引失效情况
官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。 我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。
84 0
|
数据库 索引
MysSQL索引会失效的几种情况分析
MysSQL索引会失效的几种情况分析
150 0
MysSQL索引会失效的几种情况分析
|
存储 SQL 搜索推荐
索引失效案例
索引失效案例
索引失效案例