【通用行业开发部】索引问题小排查

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

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

相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
32696 78
如何保证分布式文件系统的数据一致性
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17745 19
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36676 19
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24756 14
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36658 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29835 52

热门文章

最新文章

下一篇
开通oss服务