项目中MySQL遇到的索引失效的问题

MYSQL索引失效简介 索引失效可以简单理解为,在SQL语句执行时没有使用到索引列对数据库中的数据页进行查询。索引失效会导致查询性能显著下降,并可能引发一系列问题。 阅读详情

前言

最近做项目,遇到一些数据库MySQL日常使用中的一些问题,记录心得,主要是索引失效,基本上是无意中发生,在生产中很可能出现查询超时,全表扫描等导致业务失败。有些是不命中索引,有些是索引失效,原因各异。

准备

MySQL数据库,笔者使用9.2.0版本,一般使用8.0版本

问题

数据隐式转换

实际上我们在编程中一般都会无意识的出现隐式转换的现象,实际上大部分场景是没有任何影响的。但是在MySQL数据库中则会出现索引失效的问题。

随意建一张表

对addrId使用字符串存储,然后建索引,一般而言,其实反之亦然。

随意insert一些数据,最好超过500条,数据量少时,MySQL会出现自己会判断全表扫描更优的情况。笔者先测试500条数据。

然后查看使用索引字段查询的执行计划,可以看到使用数字查询没有走索引

这里就是隐式转换的坑,MySQL隐式转换可以正常操作数据,但是在查询时就会全表扫描,这个时候就不仅仅是慢SQL的问题了,如果出现一定量的数据,比如100W,会造成数据库本身的CPU使用率非常高,性能极差。

使用字符串查询试试

可以看到走了索引,实际上表数据量越大越明显,现在几百条数据,实际上全表扫描也没什么问题,毕竟现在数据库基本上都是SSD存储数据。

如果代码使用数字(int),而数据库使用字符串(varchar)是经常可能会出现的场景,问题很好排查,就是MySQL慢日志就能发现,但是这种情况没法及时修复,需要改代码。而且数据量小的时候不会有什么问题,不容易发现。

另外关于MySQL的索引字段使用varchar还是int类型:结论是能使用int就使用int,根据来源于B+树🌲的存储结构,字符串varchar的排序效率低于int,而且字符串的排序规则与int也是有区别的。

而我们经常使用基本上是int类型的数值比较。

MySQL统计信息收集

MySQL(其实其他数据库也存在这种现象)会根据数据的增删改进行统计信息的收集,一般而言对索引影响不大,但是在短时间大量的数据变化时,尤其是进行删除或者truncate时,统计信息来不及收集,会导致新增大量数据无法命中索引。实际上这种情况出现在分析型数据库居多,比如TIDB等。比如有批处理,使用某个表缓存数据

  1. 执行前清空表truncate
  2. 然后短时间大批量写入,比如100w条
  3. 再通过查询执行处理任务

即使查询的字段有建索引,也会面临索引失效的问题。实际上可以配置数据的变化超过一定的数量,MySQL自动触发更新统计信息分析,但是数据量变化太多,会更新不及时,导致MySQL认为全表扫描更有效。而且默认情况MySQL说是24小时失效一次(information-schema-statistics-table)。

Columns in STATISTICS that represent table statistics hold cached values. The information_schema_stats_expiry system variable defines the period of time before cached table statistics expire. The default is 86400 seconds (24 hours). If there are no cached statistics or statistics have expired, statistics are retrieved from storage engines when querying table statistics columns. To update cached values at any time for a given table, use ANALYZE TABLE. To always retrieve the latest statistics directly from storage engines, set information_schema_stats_expiry=0. 

我这里新增了500条数据,元数据统计还是19条。以9.2版本MySQL为例:https://dev.mysql.com/doc/refman/9.2/en/optimizer-statistics.html

解决方法:

1. use ANALYZE TABLE. To always retrieve the latest statistics directly from storage engines, set information_schema_stats_expiry=0

写入大量数据后,手动执行ANALYZE TABLE;或者设置缓存失效时间为一个较小的值,但频繁失效会造成MySQL统计分析的负担。

2. hint强制索引,因为我们明确知道数据量,所以可以强制MySQL走索引,提高查询效率。

总结

实际上项目中为了快速上线,很多时候都考虑到了数据库的各种情况,索引的优化,但是毕竟业务需求多,难免会在项目的某个时候没注意就出现了索引失效的情况,而且刚开始数据量较小,实际上也没啥影响,但是随着数据的增加,索引一旦失效,在大表查询时,查询缓慢,数据库CPU消耗高。所以本质上需要建立一套验证环境SQL全表扫描的监控工具,避免问题的在实际场景发生。

MySQL索引失效的场景 表中的某些列可能会存储 NULL 值,如果把这些 NULL 值都放到记录的真实数据中会比较浪费空间,所以 Compact 行格式把这些值为 NULL 的列存储到 NULL值列表中。如果存在允许 NULL 值的列,则每个列对应一个二进制位(bit),二进制位按照列的顺序逆序排列。二进制位的值为1时,代表该列的值为NULL。二进制位的值为0时,代表该列的值不为NULL。另外,NULL 值列表必须用整数个字节的位表示(1字节8位),如果使用的二进制位个数不足整数个字节,则在字节的高位补 0。 阅读详情

相关推荐

保姆级教程:在Windows/Mac上从零部署清华Kronos股票预测模型(含Qlib数据更新避坑指南)

本文提供了一份详细的指南,帮助用户在Windows和Mac系统上从零部署清华Kronos股票预测模型,包括环境配置、模型权重获取、Qlib数据更新避坑等关键步骤。特别针对国内用户遇到的网络问题和数据更新不及时提供了解决方案,适合量化投资和金融科技爱好者快速上手。

weixin_29053577的博客 622

联合索引失效(未注意最左原则)问题解决

生产上有一个运行了个多月的项目,随着数据越来越多,查询就变得越来越慢,按理说STATUS这个字段也加了索引,为什么会这么慢呢?之前有一篇文章已经讲解过索引的最左原则,今天讲讲为什么联合索引失效了。 我们执行如下语句:SHOW INDEX FROM T_table_name 查看该表的索引情况: Table:表名称 Non_unique:如果索引不能包括重复词,则为0。如果可以,则为1。...

weixin_39309402的博客 2724

动手学Moveit2 | 运行配置好的机械臂功能demo

通过这个小demo你可以直观的感受moveit2的强大,但还有很多需要我们探索的,比如机械臂是如何规划的,规划的过程中如何结合环境信息,规划的时候机械臂如何求解,如何和真实的机械臂对接等等,这些都需要你来进一步探索,今天就到这里,明天给大家秀一下小仙女焊的fishbot运控板。

生活不止眼前的苟且 8878

MySQL索引失效的几种情况

今天项目需要,历史数据有一张表,数据量大概80W条左右,由于项目架构要求查询不能超过3秒,80万数据分页查询时候,时间大概在5秒左右,显然不达标,后来增加了索引,时间提升至500ms左右,提升性能10倍左右,非常爽! 项目使用实例:ALTER TABLE lq_doarecord ADD INDEX idx_doarecord_sn (sn) USING BTREE ; 后来查询一下mysql中索...

wujian_csdn_csdn的博客 1057

电路设计仿真软件:Mentor Graphics_(1).MentorGraphics电路设计仿真软件概述

菜单栏:包含文件、编辑、视图、工具等菜单。工具栏:提供常用的工具按钮,如打开、保存、仿真等。原理图编辑区:用于绘制电路原理图。元件库:包含各种电路元件,支持拖拽操作。属性面板:显示选中元件的属性,可以进行参数设置。仿真控制区:用于设置仿真参数和控制仿真过程。输出窗口:显示仿真结果和日志信息。打开模型编辑器:点击“工具”菜单,选择“模型编辑器”。选择模型类型:在模型编辑器中选择模型类型,如SPICE模型。输入模型参数:根据需要输入模型的参数,如电阻值、电容值等。保存模型。

kkchenjj的博客 1921

构建基于知识图谱的金融风险关联网络

在金融领域,风险的识别和管理至关重要。传统的风险分析方法往往只能处理单一维度的数据,难以全面捕捉金融市场中复杂的风险关联关系。构建基于知识图谱的金融风险关联网络的目的在于整合多源异构的金融数据,通过知识图谱的方式清晰地展示金融实体之间的复杂关系,从而更准确地识别潜在的金融风险,为金融机构的风险管理决策提供有力支持。本项目的范围涵盖了从金融数据的收集、预处理,到知识图谱的构建,再到金融风险关联网络的搭建和分析。

SuperAGI2025 1418

Spring Boot项目中MySQL索引失效的常见场景与解决方案

摘要:SpringBoot项目中MySQL索引失效是常见性能问题,主要原因包括:对索引列进行运算或函数操作、隐式类型转换、违反最左前缀原则、LIKE查询以%开头、OR条件使用不当等。解决方案包括:避免索引列运算、确保类型匹配、合理设计复合索引、使用右模糊查询等。开发时应使用EXPLAIN分析执行计划,开启SQL日志监控,并遵循保持类型一致、优化查询设计等最佳实践。这些措施可有效避免索引失效,提升系统性能。

qq_45110186的博客 991

SAP 与 Palantir 合作全景解析:这不是普通集成,而是把 ERP、数据语义层、云迁移与企业级 AI 串成一条价值链

SAP与Palantir的战略合作聚焦企业数字化转型核心痛点,通过深度技术整合构建"数据-决策-执行"闭环。合作包含四大主线:云迁移连续性保障、SAP业务数据云与Palantir平台对接、联合工程开发、高监管行业优先落地。技术实现上采用SAP认证插件,支持双向数据交互和实时业务动作触发。该合作突破了传统ERP系统局限,将业务语义与AI执行相结合,特别适合制造业供应链优化、财务争议处理等高价值场景,为企业在云迁移过程中实现业务连续性与智能化升级提供新范式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 192

mysql索引失效_如何防止MySQL索引失效?

作者|bingfeng来源 |一个程序员的成长(ID:xiaozaibuluo)头图 | 优快云下载自视觉中国最近一直忙着处理原来老项目遗留的一些 SQL 优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢 SQL ,导致 MySQL 的 CPU 资源飙升,基于此,给大家简单分享下这些比较使用的易于学习和使用的经验。这次的话简单说下如何防止你的索引失...

weixin_39555715的博客 79

PostgreSQL的学习心得和知识总结(八十二)|深入理解PostgreSQL数据库SQL语句的词法解析和语法解析流程

postgresql 词法解析语法解析流程

孤傲小二~阿沐的博客 5444

VSS shielding线可以floating吗?

shielding vss不打孔,就相当于dummy metal,如果周围有其他干扰线,他们影响了这段dummy metal,这段dummy metal仍然会对目标线产生干扰,bug的是,工具知道这段dummy是vss,那么计算寄生的时候仍然把它当vss,就有可能噪声没有完全消除,而用户又看不见。而真正接地的线,相当于一直是0,就不会对目标线产生干扰,一般加shield是在route之前,这时候shield能尽量覆盖目标线,等到绕线后再加就会出现shield只覆盖到一部分目标线的情况。

m0_61544122的博客 6633

【mysql like操作 查询值包括下划线引发慢查询问题】

例如:项目场景:用户表体量200w, 用户表中有一个用户昵称字段nick_name,使用用户昵称查询时,接口响应超时。

weixin_37693760的博客 652

C# NX二次开发-查找连续倒圆角面

可以通过ufun函数 UF_MODL_ask_face_type 和 UF_MODL_ask_face_props 可判断处理选择相应的一组圆角面。在QQ群里有人问怎么通过一个选择一个倒圆角面来自动选中一组倒圆角面。这个是初步思路,如果有更好的思路可回复讨论一下。

fhqiwmc的博客 616

MySQL-面经

通过辅助索引(辅助索引存放的是指向聚簇索引的ID值),找到聚簇索引的ID值,然后再基于查询到的ID值,再走ID字段的主键索引,最终得到一整条行数据并返回。先记录redo-log日志,标记为prepare状态,提交之后再写bin-log,然后更新redo-log为commit状态。叶节点:不会存储数据,仅存储指向叶子节点的指针,好处让叶节点存储更多元素,确保树的高度不会由于数据增长而变得很高。并非所有的正向范围操作都会走索引,例如IS NULL就不会走,它的反向操作:IS NOT NULL同样不会走。

qq_35429326的博客 455

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

MySQL中什么情况下会出现索引失效?如何排查索引失效?

在MySQL中,索引是用来加快检索数据库记录的一种数据结构。索引失效指的是在进行查询操作时,本应该使用索引来提升查询效率的场景下,数据库没有利用索引,而是采用了全表扫描的方式,这会大大增加查询时间和系统负担。MySQL中什么情况下会出现索引失效?如何排查索引失效?回答。

weixin_44382896的博客 8201

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

详解MYSQL索引失效问题排查

详解MYSQL索引失效问题排查

m0_66220639的博客 2139

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【MySQL】索引失效问题总结

大家好,今天给大家总结一下索引失效的场景。有忽略的欢迎补充!

m0_74289770的博客 1799

Mysql索引失效

在数据库日常使用中,因索引失效而导致的没有充分利用索引,是导致数据库查询效率低下的一个重要原因之一。 本文介绍索引失效的十一种情况。

m0_62946761的博客 9935

mysql索引失效

在MySQL中,索引失效指的是查询语句无法有效地使用索引,而必须进行全表扫描。索引失效可能会导致查询性能下降,特别是在处理大量数据时。

liulanba的博客 2192

MySQL索引失效的12种场景及解决方案

索引优化是一个持续的过程,需要结合具体的业务场景和数据特点。通过了解这些索引失效的场景和原理,你可以更有针对性地设计索引策略,显著提升数据库性能。没有一劳永逸的索引方案,随着数据量的增长和业务的变化,索引策略也需要不断调整和优化。持续监控、分析和优化是保持高性能数据库的关键。

风象南的专栏 4122

MySQL插入中文1366报错以及索引失效的小问题

中文插入失败原理和姐姐方法,InnoDB的B+tree数据结构中导致索引失效的情况和原理剖析

墨羽晨的博客 6055

简单谈谈MySQL的索引失效问题

简单谈谈MySQL的索引失效问题 文章目录简单谈谈MySQL的索引失效问题前言课程简介mysql逻辑架构简述mysql的架构层次及其功能1、连接层2、服务层3、引擎层4、存储层存储引擎简介MyISAM与InnoDB对比谈谈SQL执行顺序7中join理论谈谈索引什么是索引?索引的优点与缺点优点缺点索引分类单值索引复合索引唯一索引主键索引基本语法创建删除查看索引结构BTree索引Hash索引full-text索引R-Tree索引应不应该创建索引哪些情况需要创建哪些情况不需要创建性能优化分析:SQL性能慢Expl

if's Blog 1063

MySQL索引优化系列:(三)索引失效

我们可能知道,索引不是在任何时候都会生效的,在很多时候索引可能不会产生效果,那么到底什么情况会导致索引失效呢?

菜菜bu菜的博客 1745
上一篇: macOS 15.4.1 Chrome不能访问本地网络
下一篇: springboot 2.4跨域变化和swagger结合的问题
fenglllle
博客等级 码龄8年 461粉丝 242原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值