索引问题小排查

简介: 数据库表已建立相关索引,查询SQL也遵循了相关规范,但是查询SQL依然不走索引。甚至同样的表,同样的索引,同样的查询SQL,在非生产环境走索引,但是生产环境却走了全表扫描。遇到此类问题该如何排查?又有那些注意事项呢?

在日常研发和排查线上环境中,我们常常遇到数据库SQL查询的性能问题。通常而言,我们按照相关的规范要求,针对数据库表,建立合适的索引,在查询SQL中遵循相关的规范即可解决相关问题。但往往也会遇到一些特殊情况。如数据库表已建立相关索引,查询SQL也遵循了相关规范,但是查询SQL依然不走索引。甚至同样的表,同样的索引,同样的查询SQL,在非生产环境走索引,但是生产环境却走了全表扫描。遇到此类问题该如何排查?又有那些注意事项呢?
首先,我们通过执行相关SQL,判断下问题现状,为后续的分析及处理打下基础:
1、运行执行计划,查看是否走索引:
执行计划.jpg

2、运行语句,查看索引的相关情况
show index from table_name;//table_name 是表名
索引.png

通过查看,我们可以很清晰的发现,执行计划不走索引,表索引存在,但是索引的cardinality为0。cardinality是索引列的唯一值的个数,如果是复合索引就是唯一组合的个数,是MySQL优化器对语句执行计划进行判定时依据。如果cardinality为0或者较小,MySQL优化器会认为该索引对查询SQL没有帮助,会自动放弃走相关索引。

那么为什么cardinality会较小甚至为0呢,造成这种情况的原因有多种,通常而言包括如下:
1、索引没有区分度,导致cardinality较小,但通常不会为0。该问题比较容易排查,通过查询索引健不重复值即可看出,不再赘述。
2、数据库存储空间不足。在数据库存储空间使用达到一定比例后,导致数据库索引无法真实建立,cardinality为0。
3、频繁的大表删除或插入等,导致关键字的分布存在问题;

根据由易到难的操作,我们通常先排查是否是存储空间不足导致的该现象出现:
1、查看整体大小:
select sum(data_length/1024/1024) as data from tables
2、查看对应的表的大小:
select
concat(truncate(data_length/1024/1024,2),' MB') as data_size,
concat(truncate(index_length/1024/1024,2),' MB') as index_size
from information_schema.tables
where TABLE_SCHEMA = 'databse_name' and TABLE_NAME = 'table_name' //databse_name是数据库名 table_name 是表名
通常而言,在使用率超过60%,建议扩容;超过80%,必须扩容。

如果表空间使用率较低,或者扩容后并没有解决相关问题,则建议通过表分析处理。
表分析SQL:analyze table table_name //table_name 是表名
需要提醒的是:表分析建议由DBA处理。表分析因为需要关闭table,然后重新打开table,在有表修改及慢SQL执行的情况下,有很大可能会导致锁表。

原文发自:https://developer.aliyun.com/article/826427?groupCode=gts_whale

相关文章
|
7月前
|
SQL Oracle 关系型数据库
分析索引失效的几种情况
联合索引 is not null 只要在建立的索引列(不分先后)都会走, in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),或者=一个值; 当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。
101 1
|
7月前
|
SQL Oracle 关系型数据库
索引失效的情况分析
大家都知道,一条查询语句走了索引和没走索引的查询效率是非常大的,在我们建好了表,建好了索引后,但是一些不好的sql会导致我们的索引失效,下面介绍一下索引失效的几种情况
43 0
|
7月前
|
SQL 存储 关系型数据库
真正线上索引失效的问题是如何排查的
MySQL索引失效是一种常见问题,在处理慢查询时经常需要考虑索引失效的可能性。 针对索引失效的排查,关键步骤包括确定需要分析的SQL语句,并通过`EXPLAIN`查看其执行计划。主要关注`type`、`key`和`extra`这几个字段。
真正线上索引失效的问题是如何排查的
|
SQL Arthas druid
MyBtais 批量插入慢排查及分析(后续)
MyBtais 批量插入慢排查及分析(后续)
185 0
|
数据库 索引
MysSQL索引会失效的几种情况分析
MysSQL索引会失效的几种情况分析
153 0
MysSQL索引会失效的几种情况分析
|
SQL 监控 固态存储
优化系列 | 实例解析MySQL性能瓶颈排查定位
优化系列 | 实例解析MySQL性能瓶颈排查定位
151 0
|
JSON fastjson Java
JSON小记
JSON小记
191 0
|
JavaScript 搜索推荐 前端开发
一次解决页面特效问题的排查记录
大家在做项目的时候,肯定会和我一样,碰到各种各样的问题,然后熟练的打开搜索引擎,输入些关键字,开始解决问题。最近在做一个效果,中间就碰到了各种问题,接下来我把解决这个问题的过程发出来分享下,也算是我的一个小心得。 要做的效果其实很简单,就是在做支付的时候,出现一个弹出层,然后跳到一张新页面,类似于下面两张图片的效果:
一次解决页面特效问题的排查记录
|
Java Maven Spring
Spring Cloud Alibaba 项目搭建
Spring Cloud Alibaba 项目搭建
696 0
|
SQL 自然语言处理 监控
日志服务索引那些事儿
日志服务索引那些事儿 简介 日志是排查问题最基本也是最重要的信息,排查问题原始的方式是登录机器查看日志,分布式场景下登录所有的机器代价太大,不利于问题排查。所以需要将日志集中采集,而且要快速查询到问题日志。
2797 0