MySQL的索引失效的原因有那些
1. 数据类型不匹配
详细说明:MySQL在比较不同数据类型的值时,可能会尝试进行隐式转换。如果这种转换导致了复杂度增加或无法直接利用索引,则会导致索引失效。
实例与解决方案:
-- 错误示例:数据类型不匹配
select * from users where id = '123'; -- id 是 int 类型,'123' 是字符串-- 正确示例:确保数据类型一致
select * from users where id = 123; -- 使用正确的数据类型-- 如果必须使用字符串输入,可以显式转换
select * from users where cast(id as char) = '123';
解决方案:确保查询条件中的值与列的数据类型相匹配。如果必须使用不同类型的值,请显式地进行类型转换。在应用层面上,确保传入数据库的参数类型正确。
2. 隐式转换
详细说明:隐式转换是指 mysql 自动将一个数据类型转换为另一个数据类型。这种转换可能改变原始的查询模式,导致索引失效。
实例与解决方案:
-- 错误示例:隐式转换
select * from users where age = 25 + 0.0; -- 强制浮点数运算-- 正确示例:避免不必要的数学运算
select * from users where age = 25; -- 直接使用整数
解决方案:尽量保持查询条件简单明了,避免不必要的数学运算或其他可能导致隐式转换的操作。编写SQL语句时,确保数据类型一致性。
3. 函数或表达式
详细说明:对索引列应用函数或复杂的表达式会阻止 mysql 使用该索引,因为它需要计算每一行的结果,从而失去了索引的优势。mysql 8.0 引入了表达式索引(也称为函数索引),可以在某些情况下帮助缓解这个问题。
实例与解决方案:
-- 错误示例:索引列上使用函数
select * from articles where length(title) > 10;-- 改进方法(取决于需求)
select * from articles where title like '___________%'; -- 假设标题至少有11个字符-- 或者创建表达式索引(mysql 8.0+)
create index idx_title_length on articles ((length(title)));
select * from articles where length(title) > 10;
解决方案:尽可能避免在索引列上使用函数。如果必须这样做,请考虑创建表达式索引或重新设计查询逻辑。对于较老版本的MySQL,重构查询以避免使用函数可能是唯一的选择。
4. 范围查询之后的列
详细说明:在复合索引中,一旦出现了范围条件,mysql 就不能再使用后续的索引部分,因为这些部分不再能够有效地缩小搜索范围。复合索引的设计应该考虑到查询模式。
实例与解决方案:
create index idx_name on table (col1, col2);
select * from table where col1 = 'value1' and col2 > 'value2';-- 如果你经常需要基于 col2 的范围查询,可以考虑创建一个单独的索引
create index idx_col2 on table (col2);
解决方案:对于频繁使用的范围查询,应该单独为涉及的列创建索引。同时,在设计复合索引时要考虑到查询模式,尽量让等值条件先于范围条件出现。
5. like 查询
详细说明:like
模式以通配符开头时,mysql 不能使用索引来加速查询,因为它需要扫描所有可能的前缀。然而,如果通配符出现在模式的末尾,则索引仍然可以被使用。
实例与解决方案:
-- 不理想的查询
select * from names where name like '%john%';-- 改进方法(根据实际情况)
-- 如果是尾部模糊匹配,可以使用索引
select * from names where name like 'john%';-- 或者使用全文索引(适用于大量文本搜索)
alter table names add fulltext(name);
select * from names where match(name) against('john');-- 对于前缀匹配,可以使用索引覆盖
select * from names where name >= 'john' and name < 'johnz';
解决方案:尽量避免使用以通配符开头的LIKE
查询。如果确实需要这样的功能,可以考虑使用全文索引或者其他专门的搜索引擎。对于前缀匹配,可以通过范围查询实现索引的有效利用。
6. or 条件
详细说明:使用 or
连接的不同列上的条件可能导致 mysql 无法有效利用索引,特别是当 or
条件跨越多个不同的列时。mysql 5.6 及以后版本支持索引合并策略,可以在某些情况下提高性能。
实例与解决方案:
-- 不理想的查询
select * from users where first_name = 'john' or last_name = 'smith';-- 改进方法(根据实际情况)
-- 如果查询频率较高,可以考虑创建组合索引
create index idx_first_last_name on users (first_name, last_name);-- 或者重构查询逻辑,如使用 union
select * from users where first_name = 'john'
union all
select * from users where last_name = 'smith';-- 利用索引合并(mysql 5.6+)
explain select * from users where first_name = 'john' or last_name = 'smith';
解决方案:评估是否可以通过创建组合索引或者重构查询逻辑来提高性能。对于某些情况,UNION
可能是更好的选择。检查EXPLAIN
输出,看看是否启用了索引合并。
7. 全表扫描更高效
详细说明:对于非常小的表或者返回大部分行的查询,全表扫描可能比使用索引更快,因为索引访问涉及到额外的 i/o 操作。mysql 优化器会权衡利弊,决定最合适的执行计划。
实例与解决方案:
-- 对于小表,即使有索引也可能选择全表扫描
select * from small_table;-- 对于大表,如果查询返回大量行,优化器也会倾向于全表扫描
select * from large_table where some_condition;
解决方案:理解MySQL优化器的行为,不要盲目依赖索引。有时候,对于特定的小表或高覆盖率查询,全表扫描是最佳选择。定期分析查询性能,确保优化器做出正确的决策。
8. 索引选择性低
详细说明:选择性低意味着索引列包含大量的重复值,使得索引的效果大打折扣。在这种情况下,mysql 可能会认为全表扫描更加高效。选择性高的索引可以显著提高查询性能。
实例与解决方案:
-- 性别列的选择性很低
select * from employees where gender = 'm';-- 改善方法(根据实际情况)
-- 尽量避免在低选择性的列上创建独立的索引,除非它们与其他高选择性的列一起组成复合索引
create index idx_gender_salary on employees (gender, salary);
解决方案:避免在选择性低的列上创建独立的索引。可以考虑与其他高选择性的列组合成复合索引。通过analyze table
命令获取统计信息,评估索引的选择性。
9. 覆盖索引不足
详细说明:当查询中所选的列不在索引中时,mysql 必须回表获取完整行信息,这增加了额外的 i/o 成本,降低了索引的效率。覆盖索引可以显著减少读取时间。
实例与解决方案:
-- 假设有一个覆盖索引 idx_id_name 包含 id 和 name 列
select id, name, address from customers where id = 123;-- 改善方法
create index idx_id_name_address on customers (id, name, address);
解决方案:创建覆盖索引,即包括查询中所有需要的列。这样可以在索引中直接获取所需数据,而无需回表。注意,覆盖索引虽然提高了读取速度,但可能会影响写入性能,因此需要平衡考虑。
10. 统计信息不准确
详细说明:mysql 优化器依赖于表的统计信息来决定查询计划。如果这些统计数据过时或不准确,优化器可能会做出错误的决策。维护良好的统计信息对于优化查询至关重要。
实例与解决方案:
-- 分析表以更新统计信息
analyze table your_table;-- 或者使用 optimize table 来重建表并更新统计信息
optimize table your_table;-- 在 mysql 8.0 及以上版本,还可以使用系统变量控制统计信息的收集
set persist optimizer_switch='histogram=on';
解决方案:定期运行analyze table
或optimize table
命令来保持统计信息的准确性。这对于大型表尤其重要。在MySQL 8.0及以上版本,可以启用直方图统计信息来更好地反映数据分布。
11. 锁争用
详细说明:在高并发环境下,锁机制的存在可能导致索引效率下降,即使有合适的索引也无济于事。锁定问题不仅影响索引效率,还可能导致其他并发问题,如死锁。
实例与解决方案:
-- 在高负载系统中,频繁更新某张表可能会导致读取操作等待写锁释放
-- 解决方案包括但不限于调整事务隔离级别、优化 sql 语句减少锁定时间等。-- 降低事务隔离级别以减少锁定
set session transaction isolation level read committed;-- 使用乐观锁策略,如添加版本号列
alter table your_table add column version int default 0;
update your_table set column1 = value1, version = version + 1 where id = specific_id and version = current_version;
解决方案:优化SQL语句以减少锁定时间,考虑适当的事务隔离级别,评估是否可以使用乐观锁策略。对于高并发环境,考虑分库分表、读写分离等架构优化措施。
使用 mysql 工具进行诊断和优化
- explain:使用
explain
关键字查看查询执行计划,了解 mysql 是如何处理你的查询的。 - show index:显示表的索引信息,帮助评估现有索引的有效性和适用性。
- performance_schema:监控和诊断 mysql 性能问题,包括锁定、线程状态等。
- slow query log:记录慢查询日志,找出那些执行时间过长的查询。
- information_schema:访问有关数据库元数据的信息,如表结构、索引等。
通过上述详细的讨论,我们可以看到,mysql 索引失效的问题往往可以通过合理的查询优化、索引设计和维护来解决。了解你的数据分布、查询模式以及 mysql 优化器的工作原理是构建高效数据库应用的关键。持续监控和优化数据库性能,确保索引得到充分利用,是保证应用程序响应快速和稳定的重要步骤。
相关文章:
MySQL的索引失效的原因有那些
1. 数据类型不匹配 详细说明:MySQL在比较不同数据类型的值时,可能会尝试进行隐式转换。如果这种转换导致了复杂度增加或无法直接利用索引,则会导致索引失效。 实例与解决方案: -- 错误示例:数据类型不匹配 select *…...
Java重要面试名词整理(十):Kafka
文章目录 Kafka简介相关概念Kraft集群 Kafka收发消息梳理客户端工作机制消费者分组消费机制生产者拦截器机制消息序列化机制消息分区路由机制生产者消息缓存机制发送应答机制生产者消息幂等性生产者消息事务 Kafka集群架构设计-Kafka的Zookeeper元数据梳理Leader Partition选举…...

内置ALC的前置放大器D2538A/D3308
一、概述 D2538A/D3308是芯谷科技推出的带有ALC(自动电平控制)的前置音频放大器芯片,最初产品为单声道/立体声收录机及盒式录音机而开发,作为录音/回放的磁头放大器使用;由于产品的高增益、低噪声及ALC外部可调的特性&…...

04-微服务02
我们将黑马商城拆分为5个微服务: 用户服务 商品服务 购物车服务 交易服务 支付服务 由于每个微服务都有不同的地址或端口,相信大家在与前端联调的时候发现了一些问题: 请求不同数据时要访问不同的入口,需要维护多个入口地址…...
Java中的this关键字详解:深入理解与应用
目录 一、this关键字的基本概念 二、this指代当前对象 示例: 三、this区分成员变量与方法参数 示例: 四、使用this()调用构造方法 示例: 五、使用this传递当前对象 示例: 六、this的其他注意事项输出结果: …...
2、C#基于.net framework的应用开发实战编程 - 设计(二、四) - 编程手把手系列文章...
二、设计; 二.四、制定设计规范; 编码规范在软件编程里起到了非常重要的作用,主要是让代码更加的规范化,更加的简洁,更加的漂亮,更加的能够面向对象显示。 以前那个系列就有发布C#的编码规范的文…...

设置首选网络类型以及调用Android框架层的隐藏API
在Android SDK中提供的framework.jar是阉割版本的,比如有些类标记为hide,这些类不会被打包到这个jar中,而有些只是类中的某个方法或或属性被标记为hide,则这些类或属性会被打包到framework.jar,但是我们无法调用&#…...

“Gold-YOLO:基于聚合与分发机制的高效目标检测新范式”
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年12月26日8点00分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文源地址(有视频…...

神经网络-AlexNet
AlexNet是在2012年的ImageNet竞赛后,整理发表的文章,也是对CNN网络的衍生。 网络结构 AlexNet网络结构如下图所示,网络分为了上下两部分,对应两个不同的GPU训练,可以更好的利用GPU算力。只有在特殊的网络层后&#x…...
Hutool 发送 HTTP 请求的几种常见写法
最简单的 GET 请求: String result HttpUtil.get("https://www.baidu.com");带参数的 GET 请求: // 方法1: 直接拼接URL参数 String result HttpUtil.get("https://www.baidu.com?name张三&age18");// 方法2: 使用 HashMap…...

【Linux】进度条
本文中,我们来写一个进度条。 本文大纲: 写一个命令行版的进度条。 1.回车换行 2.缓冲区问题(本文不深究) 2.1测试代码 3.写一个什么样的进度条? version1 version2 回车换行 这俩不是一个概念&…...
【zookeeper核心源码解析】第四课:客户端与服务端读写的io核心流程
系列文章目录 【zookeeper核心源码解析】第一课:zk启动类核心流程序列图 【zookeeper核心源码解析】第二课:俯瞰QuorumPeer启动核心流程,实现选举关键流程 【zookeeper核心源码解析】第三课:leader与follower何时开始同步&#…...
强化学习蘑菇书笔记
绪论 强化学习就是一个智能体在一个不确定的环境中最大化它的奖励。智能体在一个环境中获取某个状态后,做一个动作,也称为决策,在环境中执行这个决策以后,会有一个奖励。尽可能多地获得更多的奖励。 强化学习概述 强化学习与监…...

《机器学习》——线性回归模型
文章目录 线性回归模型简介一元线性回归模型多元线性回归模型误差项分析一元线性模型实例完整代码 多元线性模型实例完整代码 线性回归模型简介 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 相关关系&…...
Linux(Centos 7.6)网卡信息没有了问题处理
1.问题现象 虚拟机打开后,使用ifconfig查看IP信息,虚拟机默认的网卡名称是ens33,ifconfig没有看到相关问题,远程连接工具Xshell也不能正常访问该虚拟机。 [rootnode1 ~]# ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu…...

WEB攻防-通用漏洞-文件上传-js验证-MIME验证-user.ini-语言特征
目录 定义 1.前端验证 2.MIME验证 3.htaccess文件和.user. ini 4.对内容进行了过滤,做了内容检测 5.[ ]符号过滤 6.内容检测php [] {} ; 7.()也被过滤了 8.反引号也被过滤 9.文件头检测 定义 文件上传漏洞是指攻击者上传了一个可执行文件(如木马…...
mybatis-plus代码生成器
<!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!--mybatis-plus-generator 生成器--><depende…...
12.24-12.28Mysql锁阅读笔记
1.Mysql的锁有哪些种类 全局锁, 通过flush tables with read lock 应用场景是全局备份,备份的时候如果有两个表,备份 先备份了用户表,然后用户了商品,再备份商品表 那么商品表库存减少了,然而用户表的育儿…...

支持最新 mysql9的workbench8.0.39 中文汉化教程来了
之前在 B 站上发布了 mysql8 workbench 汉化教程,一年多来帮助很多初学者解决了不熟悉英文的烦恼。 汉化视频可以访问: 2024最新版mysql8.0.39中文版mysql workbench汉化 中文升级 旧版汉化报错解决_哔哩哔哩_bilibili MySql Workbench汉化_哔哩哔哩_…...
golang连接jenkins构建build
1.安装jenkins依赖 go get github.com/bndr/gojenkins2.代码 import ("context""file/utils/logs""github.com/bndr/gojenkins""github.com/gin-gonic/gin""net/http""time" )// 接收单个静态文件上线参数 type…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...