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

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

相关文章
|
存储 Java 测试技术
【通用行业开发部】阿里开源TransmittableThreadLocal使用经验记录
本文章主要记录我在一次业务优化中,使用线程池带来的子父线程值传递问题,及使用TransmittableThreadLocal来解决该问题的经验,并对TransmittableThreadLocal原理做些梳理。
|
6天前
|
存储 数据库 流计算
TDengine 资深研发分享解决思路,长查询不再成为系统性能瓶颈!
本文探讨了如何应对和解决长查询问题,以提升 TDengine 在复杂查询场景下的表现。
59 0
|
6月前
|
存储 监控 关系型数据库
传统库分表麻烦查询慢?TDengine 如何解决“搜狐基金”的应用难题
搜狐基金团队使用的 MySQL 数据库在面对海量数据时存在能力瓶颈,在此背景下,其决定基于 TDengine 尝试一下全新的方案。
107 0
|
9月前
|
XML JSON 缓存
Java实现天眼查API根据企业纳税识别号查询企业详情数据方法
Java实现天眼查API根据企业纳税识别号查询企业详情数据方法
404 0
【SQL开发实战技巧】系列(二十五):数仓报表场景☞结果集中的重复数据只显示一次以及计算部门薪资差异高效的写法以及如何对数据进行快速分组
本篇文章讲解的主要内容是:***如何使用lag函数让结果集重复数据只显示一次、用行转列pivot写法优化部门之间计算工资差异类似需求、如何通过ceil函数对已有数据进行分组打印、放假安排团队分组值班,如何通过ntile()over(order by )快速进行人员分组***
【SQL开发实战技巧】系列(二十五):数仓报表场景☞结果集中的重复数据只显示一次以及计算部门薪资差异高效的写法以及如何对数据进行快速分组
【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
本篇文章讲解的主要内容是:***如果有重复数据如何检查出两个表中的差异数据及对应条数、表连接做聚合容易出现重复计算的错误、多表查询空值处理问题、NOT IN的子查询范围不能是空值,否则查询结果为空。***
【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
按键精灵实现交易开拓者TB自动化优化参数
按键精灵实现交易开拓者TB自动化优化参数
214 0
|
前端开发 JavaScript 测试技术
【测试开花】五、项目管理-前端-实现查询、新增功能
【测试开花】五、项目管理-前端-实现查询、新增功能
【测试开花】五、项目管理-前端-实现查询、新增功能
html+css实战43-综合案例-学生信息表
html+css实战43-综合案例-学生信息表
248 0
html+css实战43-综合案例-学生信息表