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

简介: 数据库表已建立相关索引,查询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执行的情况下,有很大可能会导致锁表。

相关文章
|
弹性计算 Ubuntu Linux
2024年幻兽帕鲁服务器新手攻略指南、幻兽帕鲁服务器搭建
相信大家都已经体验过幻兽帕鲁这个游戏了,但是因为游戏太过火爆,登入人数太多,游戏体验感很差,这个时候就可以通过自己搭建专用幻兽帕鲁服务器来邀请自己的小伙伴一起游玩,本文就讲讲幻兽帕鲁服务器搭建:专用服务器设置全攻略。
310 4
|
6月前
BigDecimal保留两位小数
本文介绍了BigDecimal保留两位小数的三种方法:`setScale`、`DecimalFormat`和`String.format`。其中,`setScale`可设置保留规则并返回BigDecimal类型值;`DecimalFormat`通过匹配规则返回字符串类型值;`String.format`为字符串自带方法,同样返回字符串类型值。此外,文章还对比了四种保留小数规则(如`00.00`、`#0.00`等),总结出`#0.00`是最适用的规则。附有详细代码示例与控制台打印结果,便于理解与实践。
989 19
【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误
【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误
243 0
|
11月前
|
存储 人工智能 vr&ar
转载:【AI系统】CPU 基础
CPU,即中央处理器,是计算机的核心部件,负责执行指令和控制所有组件。本文从CPU的发展史入手,介绍了从ENIAC到现代CPU的演变,重点讲述了冯·诺依曼架构的形成及其对CPU设计的影响。文章还详细解析了CPU的基本构成,包括算术逻辑单元(ALU)、存储单元(MU)和控制单元(CU),以及它们如何协同工作完成指令的取指、解码、执行和写回过程。此外,文章探讨了CPU的局限性及并行处理架构的引入。
转载:【AI系统】CPU 基础
|
11月前
|
机器学习/深度学习 人工智能 并行计算
转载:【AI系统】AI轻量化与并行策略
本文探讨了AI计算模式对AI芯片设计的重要性,重点分析了轻量化网络模型和大模型分布式并行两大主题。轻量化网络模型通过减少模型参数量和计算量,实现在资源受限设备上的高效部署;大模型分布式并行则通过数据并行和模型并行技术,解决大模型训练中的算力和内存瓶颈,推动AI技术的进一步发展。
转载:【AI系统】AI轻量化与并行策略
基于ADM自适应增量调制算法的matlab性能仿真
该文主要探讨基于MATLAB的ADM自适应增量调制算法仿真,对比ADM与DM算法。通过图表展示调制与解调效果,核心程序包括输入输出比较及SNR分析。ADM算法根据信号斜率动态调整量化步长,以适应信号变化。在MATLAB中实现ADM涉及定义输入信号、初始化参数、执行算法逻辑及性能评估。
|
11月前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
12月前
|
缓存 NoSQL 网络协议
【Azure Redis】因为Redis升级引发了故障转移后的问题讨论
3:对于Redis的Server Load指标,每秒创建连接数的并发值,是否有建议呢? 【答】:为了避免将缓存推到 100% 服务器负载,建议将连接创建速率保持在每秒 30 个以下。
119 0
|
算法 IDE 开发工具
通义灵码插件的优化建议
通义灵码是基于阿里云通义大模型的编码辅助工具,旨在提升开发者效率。为更好地满足开发需求,提出以下优化建议:1)提升生成速度,优化算法,引入分批处理;2)增强跨文件感知能力,理解代码上下文;3)完善云服务支持,深化与阿里云服务集成;4)丰富功能体验,增加编程语言支持;5)提升稳定性和兼容性,确保多环境运行;6)优化用户界面和交互,提供自定义选项;7)增加用户反馈渠道和社区支持,建立开发者交流平台。通过这些改进,通义灵码将为开发者带来更高效智能的编码体验。【6月更文挑战第1天】
452 2
|
存储 Kubernetes 安全
Kubernetes:创建和分配Kubernetes Pod安全策略
Kubernetes:创建和分配Kubernetes Pod安全策略
Kubernetes:创建和分配Kubernetes Pod安全策略