Mysql杂志(三十)——索引失效情况 - 指南

news/2025/11/7 11:59:24/文章来源:https://www.cnblogs.com/slgkaifa/p/19199266

Mysql杂志(三十)——索引失效情况 - 指南

1. 不符合最左前缀原则

这个不用多说了吧,大家应该懂的都懂,但是还是在下面附上示范吧,最左前缀原则就是想使用某一个索引,必须要使用这个索引的最左测的一列,不管是否需要,如果不使用就Mysql的优化器就不会选择使用这个索引。

-- 创建索引:INDEX idx_name_age_gender(name, age, gender)
-- 有效使用(符合最左前缀)
SELECT * FROM users WHERE name = '张三' AND age = 25;
-- 失效情况:
SELECT * FROM users WHERE age = 25;              -- 跳过name列
SELECT * FROM users WHERE name = '张三' AND gender = 'M'; -- 跳过age列

2. 对索引列使用函数或计算

这个也很好理解,就是字面上的意思,如果对条件列使用了函数或者计算那就会对索引失效,因为索引是等值查询,如果对他进行计算或者使用函数,那就是会对所以的数据对应的列进行相应的处理,就不会使用到索引。

-- 失效案例:
SELECT * FROM users WHERE YEAR(create_time) = 2023;  -- 对索引列使用函数
SELECT * FROM products WHERE price + 100 > 2000;     -- 对索引列进行计算
-- 优化方案:
SELECT * FROM users WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';
SELECT * FROM products WHERE price > 1900;

3.使用不等于(!=或<>)或NOT IN

这个也是很好理解的,刚刚上面有说到索引是一个等值查询,如果是不等于这种就会全部扫描一遍然后得到满足条件的列,记住索引喜好等于!讨厌不等于!

-- 失效案例:
SELECT * FROM orders WHERE status != 'completed';
SELECT * FROM customers WHERE id NOT IN (1, 2, 3);
-- 部分优化方案:
SELECT * FROM orders WHERE status IN ('pending', 'processing');
SELECT * FROM customers WHERE id > 3;  -- 如果ID连续

4.LIKE 通配符开头

这个其实也是和刚刚说的索引喜好有关系,如果是模糊查询就会对每一条数据进行比对,从而得到所有满足条件的数据,毋庸置疑这肯定就是全表扫描,索引必然失效,但使用前缀匹配或者对varchar类型的数据列使用前缀索引或者全文索引就没有那么糟,不然Mysql也不会推出这两个索引,虽然主包日常开发没有使用到。

-- 失效案例:
SELECT * FROM products WHERE name LIKE '%手机%';  -- 前导通配符
SELECT * FROM products WHERE name LIKE '_苹果%';  -- 前导通配符
-- 有效使用:
SELECT * FROM products WHERE name LIKE '苹果%';   -- 前缀匹配

5. 隐式类型转换

这个怎么说呢,我们写Java的时候好像也有这个隐式转换,比如我们字符串转数字,数字转字符串一样,Mysql同意也是支持的,但是这样会造成索引的失效,因为无法等值匹配,需要每一个条数据对应的索引列转化成对应的类型再进行比较,如下:

-- 失效案例(phone是varchar类型):
SELECT * FROM users WHERE phone = 13800138000;  -- 字符串转数字
-- 正确写法:
SELECT * FROM users WHERE phone = '13800138000';

这个phone是一个varchar类型,那么每一条数据的phone列都会先转数字对比,那么不就是全扫描了。而且这种类型转化查询出来的数据也不一定正确,因为涉及到精度的问题还有编码规则(如UTF—8)的影响。

6.OR 连接非索引列

这个其实也很好理解,我们InooDB的索引都是先对比第一索引列,即使想对比第二索引列也是在第一索引列成功命中的时候才会对比第二索引列,所以我们日常使用的时候如果有OR的场景尽量还是使用UNION进行数据集合合并,不然可能降低SQL性能。

-- 失效案例(age有索引,address无索引):
SELECT * FROM users WHERE age = 25 OR address = '北京';
-- 优化方案:
SELECT * FROM users WHERE age = 25
UNION
SELECT * FROM users WHERE address = '北京';
-- 不会失效(会被优化器优化成in):
SELECT * FROM users WHERE age = 25 OR age = 26
-- 优化后:
SELECT * FROM users WHERE age in (25,26)
-- 复合索引,可能会使用到部分索引(age)不会使用到(address):
CREATE INDEX idx_age_address ON users(age, address);
SELECT * FROM users WHERE age = 25 OR address = '北京';

7.个人认为不会索引失效的情况

1.范围查询>,<

主包个人认为是不会,因为我们InnoDB的索引都是B+树的格式,复合索引都遵守最左侧索引列 排序后再到第二列索引列排序,所以第一索引列相同的情况下,第二索引一点也是升序排序的,而且目录节点存的也是第一索引列和对应叶子节点指针,所以都是先按照第一索引找到满足条件的最左侧目录节点的行数据,然后顺序加载叶子节点对比每一条行数据第二索引是否满足。

网上说会造成索引失效或者部分索引失效的原因有的说是数据库不支持,有点说只会使用到第一索引,但是主包认为,没有使用到索引的情况可能和Myslq的优化器有关,Mysql优化器只会选择执行成本最低的,然后索引建的有问题导致成本增加,那么Mysql就不会使用这个索引。当然这个是主包个人认为哈。

2.Select * 索引失效

其实主包个人认为不存在这个失效,因为我们的聚簇索引是根据主键来的,假如你查name,那么没有这个了列的索引,怎么能被称为索引失效呢?没用到聚簇索引吗?但本来就不现实好吧。如果加了name这一列的索引,那么select * 还要回表也就是查聚簇索引找多数据,那么这也叫索引失效吗?主包认为也不是。

MySQL 四种 EXPLAIN 命令对比分析

这里再对前两篇的内容进行一个补充吧,执行计划有四种格式我们已经说了2种了,其实后面的2种字段名都是相同的,所以就不冗余的去锁了,这边就给个表格大家看看吧。这个是基本功能的对比:

命令类型

输出格式

版本要求

是否执行查询

主要用途

EXPLAIN

表格格式

全版本

基础执行计划分析

EXPLAIN FORMAT=JSON

JSON格式

5.6+

详细执行计划分析

EXPLAIN FORMAT=TREE

树形结构

8.0+

可视化执行流程

EXPLAIN ANALYZE

表格+实际数据

8.0.18+

真实执行统计

这个是详细功能的对比:

对比维度

EXPLAIN

EXPLAIN FORMAT=JSON

EXPLAIN FORMAT=TREE

EXPLAIN ANALYZE

输出内容

基础执行计划

详细执行计划+成本估算

执行流程树形图

实际执行统计

执行成本

预估成本

预估成本

预估成本

实际成本

扫描行数

预估行数

预估行数

预估行数

实际行数

索引信息

基础索引使用

详细索引使用情况

索引使用路径

实际索引效率

是否执行查询

适用场景

快速检查

深度分析

流程可视化

精准优化

这个是优缺点分析:

命令类型

优点

缺点

最佳使用场景

EXPLAIN

简单直观,全版本支持

信息有限,只有预估数据

日常快速检查

EXPLAIN FORMAT=JSON

信息全面,可编程解析

输出冗长,需解析工具

自动化分析系统

EXPLAIN FORMAT=TREE

直观展示执行流程

缺少详细成本数据

复杂查询理解

EXPLAIN ANALYZE

真实执行数据,精准

会实际执行查询,有性能影响

生产环境精准调优

总结

本篇主要讲的就是Mysql索引失效的几种情况,以及对前两篇执行计划的补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/958702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

84用python命令查看安装了那些库

import pkg_resourcesfor dist in pkg_resources.working_set:print(dist.project_name, dist.version)

84用python命令查看安装了那些库

import pkg_resourcesfor dist in pkg_resources.working_set:print(dist.project_name, dist.version)

使用NIFI 同步数据库表

使用NIFI 同步数据库表1.概述 我现在数据库发生变化后,希望实时同步到 另外的一个数据库库,当然能做数据库同步,也可以将数据同步到消息队列或其他的数据库进行备份。 2.实现过程 本次使用NIFI 组要使用了数据源 Ca…

2025年尖顶篷房生产厂家权威推荐榜单:球形篷房/多边形篷房/会展篷房源头厂家精选

在户外展览、体育赛事与工业仓储等领域,尖顶篷房凭借其灵活的结构与强环境适应性,已成为临时建筑空间的重要选择。行业数据显示,2024年国内篷房市场规模增长率稳定在15%左右,其中尖顶、球形与多边形等异形篷房需求…

手把手教你在unity中实现一个视觉小说系统(一)

本期基本功能- 打字机效果,单击后全部显示、第二次点击后出现下一句 - 分支跳转:Choice、JumpTo - log历史记录 - 自动播放auto与速度调节 - skip到下一个分歧点 - speaker高亮(非speaker半透明黑色显示)、清除立绘…

2025 年 1688 店铺代运营品牌最新推荐排行榜,专业机构实力测评及高性价比选择指南

引言 随着 B2B 电商市场渗透率突破 35%,1688 平台年交易额已超 4 万亿,但超 60% 商家仍受困于流量获取难、转化效率低等问题。为此,行业协会开展专项测评,形成最新推荐榜单。测评采用动态分析模型,围绕五大维度展…

开发快、团队小、竞争狠:小游戏项目管理的破局之道,如何在高并发项目中兼顾速度与质量?

在一家休闲小游戏公司,可能有上千个项目在同时开发。小游戏团队规模小、周期短、节奏快,却要面对极高的上线频率与激烈竞争。如何在“快节奏+多项目”的环境中,既保证创意快速验证,又维持项目质量?本文结合小游戏…

2025 东莞外贸独立站公司最新推荐榜:全链路服务商测评解析与优质品牌优选指南东莞/广州/深圳/佛山/中山/惠州外贸独立站运营公司推荐

引言 在跨境电商流量红利趋紧的当下,外贸独立站已成为企业掌握流量主权、打造全球品牌的核心载体,据行业协会数据显示,2025 年全球 B2B 电商交易规模突破 26 万亿美元,其中独立站贡献率超 35%。但市场上服务商存在…

2025年深圳刑事辩护律师权威推荐榜单:医疗纠纷案/婚姻家庭案/知识产权案法律服务专家精选

随着深圳经济社会的快速发展和法治建设的深入推进,刑事辩护领域正呈现专业化、精细化的趋势。根据司法大数据统计,2024年深圳市各级法院审理的刑事案件数量保持稳定,其中经济犯罪、网络犯罪和涉外刑事案件占比有所提…

BMS(电池管理便捷的系统)的主要作用和架构简述

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

某场模拟赛

T2 AT_abc427_e Wind Cleaning 神秘搜索 直接模拟移动障碍物的过程搜索,用 set 记录所有障碍物的位置,对于每次移动改变所有障碍物的位置,超出网格则删掉,然后标记搜过的状态,用 map 记录每一个 set 的状态是否被…

2025-11-07

数论 1.P6583 回首过去 - 洛谷(十进制有限小数)要找有限小数说明约分完分母是2和5的倍数 ![[Pasted image 20251107090503.png|200]] 所以![[Pasted image 20251107090742.png]] 即求n能被gcd整除的数量,即为x的数量…

2025年真空润滑脂厂家权威推荐榜单:无尘室润滑脂/位移平台润滑脂/电子显微镜润滑脂源头厂家精选

真空润滑脂作为工业设备中的关键润滑材料,广泛应用于高温、高压、真空等极端环境,对设备的稳定运行和寿命延长起着至关重要的作用。随着工业技术的快速发展,市场对真空润滑脂的性能要求日益提高,包括耐高温性、抗氧…

微信银行组件接口

function https_request($url,$data = null){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, (string)$url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt…

2025低烟无卤/UL3302/UL3767/UL4413辐照线厂家推荐明秀电子,品质可靠认证齐全

2025低烟无卤/UL3302/UL3767/UL4413辐照线厂家推荐明秀电子,品质可靠认证齐全 当前低烟无卤辐照线领域的技术挑战 在电线电缆行业快速发展的今天,低烟无卤辐照线技术面临着多重挑战。随着UL3302、UL3767、UL4413等国…

2025年无火焰泄压阀厂家权威推荐榜单:无火焰泄爆装置/重复式无火焰泄爆装置/重复式无火焰泄爆阀源头厂家精选

在工业安全防护领域,无火焰泄压阀作为粉尘爆炸与气体爆炸防护的核心设备,其技术性能与可靠性直接关系到人员安全与设备保全。行业数据显示,2024年全球无火焰泄压阀市场规模达亿元人民币级别,其中粉尘爆炸防护领域需…

2025内窥镜电缆线/B超线厂家推荐明秀电子,专业制造品质可靠

2025内窥镜电缆线/B超线厂家推荐明秀电子,专业制造品质可靠 当前内窥镜电缆线领域的技术挑战与数据解析 医疗电子设备领域正迎来快速发展期,其中内窥镜电缆线和B超线作为关键连接组件,其技术性能直接影响医疗设备的…

CF1834E

CF1834E MEX of LCM 固定左端点向右遍历的话,lcm一定是单调不减的,且对于每一次增加都至少翻倍,容易发现最小好数的最大取值为 \(n^2\),所以大于 \(n^2\) 的lcm不用考虑。这样的话对于每个固定的左端点,向右拓展区…

2025 年 11 月聚氨酯冷库板厂家推荐排行榜,聚氨酯冷库板,冷库保温板,阻燃冷库板,装配式冷库板公司推荐,高效保温与耐用品质口碑之选

2025 年 11 月聚氨酯冷库板厂家推荐排行榜 随着冷链物流行业的快速发展,聚氨酯冷库板作为关键保温材料,其市场需求持续增长。聚氨酯冷库板以其优异的保温性能、轻质结构和耐用特性,广泛应用于食品冷藏、医药仓储和工…

2025 年 11 月机制板厂家推荐排行榜,机制板,机制板厂家,机制板销售厂家,机制板公司推荐,专业品质与高效供应口碑之选

2025 年 11 月机制板厂家推荐排行榜:专业品质与高效供应口碑之选 随着冷链物流行业的快速发展,机制板作为冷库建设的核心材料,其市场需求持续增长。机制板不仅影响冷库的保温性能,更直接关系到冷链系统的运行效率与…