【MySQL】索引失效问题详解

news2025/4/25 10:12:34

目录

1. 最左前缀原则

2. 条件左边有函数或运算

3. 隐式类型转换

4. LIKE 模糊查询以 % 开头

5、MySQL 优化器选择全表扫描

⭐对 in 关键字特别说明⭐

(1)列表太大时,走全表扫描了

(2)隐式类型转换

(3)最左前缀原则

(4)NOT IN 导致索引失效的场景


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

1. 最左前缀原则

如果索引有多个列,即联合索引,注意他们是有顺序的。指的是查询从索引的最做前列开始匹配,并且不调过索引中的列,一旦跳过了某个索引中的列,那么对这个索引后面的列进行查询就会失效。

(1)加入给name、status、address加了联合索引: 

(2)范围查询(如 >, <, BETWEEN)之后的列不会使用索引: 

2. 条件左边有函数或运算

原因:MySQL 无法利用索引中的值进行范围匹配。

-- 索引失效,因为对字段进行了函数处理
SELECT * FROM user WHERE YEAR(birthday) = 2020;

-- 例2:name 字段的第三到第四个字符(即从 name 字段的第3个字符开始,取2个字符)等于 '科技'
SELECT * FROM user WHERE substring(name,3,2) = '科技';

 运算场景:

-- 也会失效:字段参与了运算
SELECT * FROM user WHERE age + 1 = 30;

3. 隐式类型转换

原因:由于在查询的时候,mysql的查询优化器,会自动的进行类型转换,造成索引失效

-- 如果 age 是 int 类型,'18' 是字符串,会触发类型转换
SELECT * FROM user WHERE age = '18';

-- 字符串没有加引号,也会进行隐式类型转换;下面这条sql如果status是varchar类型则索引会失效
select * from tb_user where name = '小明' and status = 0

4. LIKE 模糊查询以 % 开头

-- 索引失效(以 % 开头)
SELECT * FROM user WHERE name LIKE '%abc';

SELECT * FROM user WHERE name LIKE '%a%';

-- 可以使用索引(不以 % 开头)
SELECT * FROM user WHERE name LIKE 'abc%';

5、MySQL 优化器选择全表扫描

即使索引存在,MySQL 优化器也可能选择全表扫描,常出现在以下情况:

  • 表数据太少,扫描成本比走索引还低;
  • 索引选择性太差(重复值多);

示例:超大数据量分页

-- 查询十万页后的数据:
select * from t5 order by text limit 100000, 10;

采用这种SQL查询分页的话,从几百万数据中取出这10行数据的代价是非常大的,需要先排序查出前1000010条记录,然后抛弃前面1000000条。

使用explain分析执行情况来看,在大分页的情况下,MySQL没有走索引扫描,即使text字段已经加上了索引。

主要原因:MySQL在查询代价估算中,认为全表扫描方式比走索引扫描的方式效率更高的话,就会放弃索引,直接全表扫描。

解决:使用覆盖索引或者子查询

-- 使用覆盖索引,不需要回表查询
select id,text from t5 order by text limit 100000, 10;


--使用子查询,不需要回表查询
select * from t5 where id>=(select id from t5 order by text limit 100000,1) limit 10

⭐对 in 关键字特别说明⭐

首先,IN 关键字在 MySQL 中 并不会必然导致索引失效,关键在于使用方式是否合理

因为in关键字也会遵循上面所说的最左匹配原则、隐式类型转换、全表扫描的规定。

(1)列表太大时,走全表扫描了

-- 优化器判断走索引不划算,放弃索引
SELECT * FROM user WHERE id IN (1, 2, ..., 10000);

-- 子查询返回结果量过大时,索引可能失效
SELECT * FROM user WHERE id IN (SELECT user_id FROM orders);

(2)隐式类型转换

-- id 是 int 类型,但 IN 列表里是字符串
SELECT * FROM user WHERE id IN ('1', '2', '3');

(3)最左前缀原则

-- 有索引 (a, b),以下查询只对 a 有索引效果;因为 b 不是最左前缀,索引不会起效。
SELECT * FROM table WHERE b IN (1, 2, 3);

(4)NOT IN 导致索引失效的场景

SELECT * FROM user WHERE id NOT IN (SELECT user_id FROM orders);
  • 如果 orders.user_id 里有 NULL,那么整个 NOT IN 条件都会为 FALSE 或 UNKNOWN,结果是 整张表都不符合条件索引失效 + 结果错误
  • MySQL 在处理 NOT IN 时,会对每一行都判断是否在列表中,一旦有 NULL,逻辑就崩了。

 解决方法:确保子查询列无 NULL,或使用 NOT EXISTS 替代。 

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

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

相关文章

优选算法第十讲:字符串

优选算法第十讲&#xff1a;字符串 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 2.最长回文子串 3.二进制求和 4.字符串相乘

【扣子Coze 智能体案例四】五行八卦占卜智能体

目录 一、意图识别 二、时间格式转换 三、八字转换 四、八字提取 五、八字提取2 六、数据汇总 七、统计五行占比 八、雷达图生成 九、表格生成 十、AI占卜 十一、结束节点 一、意图识别 用户输入的信息包含各种时间格式的年月日时 用户输入的信息包含天干地支八字…

5.学习笔记-SpringMVC(P61-P70)

SpringMVC-SSM整合-接口测试 (1)业务层接口使用junit接口做测试 (2)表现层用postman做接口测试 (3)事务处理— 1&#xff09;在SpringConfig.java&#xff0c;开启注解&#xff0c;是事务驱动 2&#xff09;配置事务管理器&#xff08;因为事务管理器是要配置数据源对象&…

【专题刷题】二分查找(一):深度解刨二分思想和二分模板

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

硬核解析!电动汽车能耗预测与续驶里程的关键技术研究

引言 随着电动汽车的普及,续航里程和能耗表现成为用户关注的核心痛点。然而,表显续航与实际续航的差异、低温环境下的电量衰减等问题始终困扰着消费者。本文基于《电动汽车能耗预测与续驶里程研究》的实验成果,深入剖析电动汽车能耗预测的核心模型、多环境测试方法及续航里…

【OceanBase相关】01-OceanBase数据库部署实践

文章目录 一、前言1、介绍说明2、部署方案二、部署说明1、环境准备2、软件安装2.1、安装OAT2.2、安装OCP3、软件部署三、集群管理1、MySQL租户管理四、Q&A1、OBServer 服务器重启后 observer 进程未能自动启动1.1、问题说明1.2、解决措施2、ERROR 1235 (0A000) at line 1: …

详细讲解 QMutex 线程锁和 QMutexLocker 自动锁的区别

详细讲解 QMutex 线程锁和 QMutexLocker 自动锁的区别 下面我们详细拆解 Qt 中用于线程同步的两个核心类&#xff1a;QMutex 和 QMutexLocker。 &#x1f9f1; 一、什么是 QMutex&#xff1f; QMutex 是 Qt 中的互斥锁&#xff08;mutex&#xff09;类&#xff0c;用于防止多个…

PCB 过孔铜厚的深入指南

***前言&#xff1a;在上一期的文章中介绍了PCB制造的工艺流程&#xff0c;但仍然想在过孔的铜厚和PCB的过孔厚径比两个方面再深入介绍。 PCB铜厚的定义 电路中铜的厚度以盎司(oz)**表示。那么&#xff0c;为什么用重量单位来表示厚度呢? 盎司(oz)的定义 将1盎司(28.35 克)的铜…

Spring Security认证流程

认证是Spring Security的核心功能之一&#xff0c;Spring Security所提供的认证可以更好地保护系统的隐私数据与资源&#xff0c;只有当用户的身份合法后方可访问该系统的资源。Spring Security提供了默认的认证相关配置&#xff0c;开发者也可以根据自己实际的环境进行自定义身…

TXPOLARITY/RXPOLARITY设置

TXPOLARITY/RXPOLARITY&#xff1a;该端口用来反向输出数据的极性。 0&#xff1a;表示不反向。TXP是正&#xff0c;TXN是负&#xff1b; 1&#xff1a;标识反向。TXP是负&#xff0c;TXN是正&#xff1b; 如下图所示&#xff1a;

2026届华为海思秋暑期IC实习秋招笔试真题(2025.04.23更新)

今天给大家分享下华为海思2025.04.23号最新IC笔试真题。 华为海思IC前端中后端(COT&XPU)岗位笔试机考题 更多华为海思数字IC岗秋招实习笔试真题&#xff0c;可以私信小编。 数字后端培训实战项目六大典型后端实现案例 秒杀数字后端实现中clock gating使能端setup viola…

优考试V4.20机构版【可注册】

优考试V4.20机构版&#xff0c;可通过注册机完美激活。 优考试机构版‌是一个功能强大的在线考试系统&#xff0c;适用于各种 考试场景&#xff0c;包括在线考试、培训、学习等多种用途。以下是优考试机构版的主要功能和特点&#xff1a; ‌多层级管理‌&#xff1a;优考试机…

携国家图书馆文创打造AI创意短片,阿里妈妈AIGC能力面向商家开放

在4月23日“世界读书日”之际&#xff0c;阿里妈妈联合国家图书馆文创正式发布了三条AI创意视频。 该系列视频以“千年文脉典籍奇谈”为主题&#xff0c;借助阿里妈妈的AIGC能力&#xff0c;以AI链接古今&#xff0c;打开阅读典籍新方式&#xff0c;引起不少人强烈兴趣。据悉&…

MMsegmentation第一弹-(认识与安装)

前言 在刚接触MMsegmentation的时候&#xff0c;我是怎么看都看不明白&#xff0c;那个过程实在是太痛苦了&#xff0c;所以我当时就想着一定要把这个写成文章&#xff0c;希望后来者能很轻松的就上手。该系列文章不涉及框架的底层原理&#xff0c;仅以一个使用者的身份带领读…

React19源码阅读之commitRoot

commitRoot入口 在finishConcurrentRender函数&#xff0c;commitRootWhenReady函数&#xff0c;commitRoot函数。 commitRoot流程图 commitRoot函数 commitRoot 函数是 React 渲染流程中用于提交根节点的关键函数。它的主要作用是设置相关的优先级和状态&#xff0c;然后调…

目标检测:视觉系统中的CNN-Transformer融合网络

一、背景 无人机&#xff08;UAVs&#xff09;在城市自动巡逻中发挥着重要作用&#xff0c;但它们在图像识别方面面临挑战&#xff0c;尤其是小目标检测和目标遮挡问题。此外&#xff0c;无人机的高速飞行要求检测系统具备实时处理能力。 为解决这些问题&#xff0c;我们提出…

Turso:一个基于 libSQL的分布式数据库

Turso 是一个完全托管的数据库平台&#xff0c;支持在一个组织中创建高达数十万个数据库&#xff0c;并且可以复制到任何地点&#xff0c;包括你自己的服务器&#xff0c;以实现微秒级的访问延迟。你可以通过Turso CLI&#xff08;命令行界面&#xff09;管理群组、数据库和API…

深度学习前沿 | TransNeXt:仿生聚合注意力引领视觉感知新时代

目录 1. 引言 2. 背景与挑战 3. TransNeXt 核心创新 3.1 像素聚合注意力&#xff08;PAA&#xff09; 3.2 长度缩放余弦注意力&#xff08;LSCA&#xff09; 3.3 卷积 GLU&#xff08;ConvGLU&#xff09; 4. 模型架构详解 5. 实验与性能评估 5.1 图像分类&#xff08;I…

C语言-函数-1

以下是我初学C语言的笔记记录&#xff0c;欢迎在评论区留言补充 一&#xff0c;函数分为几类 * 函数分为两类&#xff1a; 一类是库函数&#xff1b;一类是自定义函数 * 库函数&#xff1a; 系统自己带的&#xff0c;在使用时候&#xff0c;要用到头文件&#xff1b; 查询库函…

openwrt作旁路由时的几个常见问题 openwrt作为旁路由配置zerotier 图文讲解

1 先看openwrt时间&#xff0c;一定要保证时间和浏览器和服务器是一致的&#xff0c;不然无法更新 2 openwrt设置旁路由前先测试下&#xff0c;路由器能否ping通主路由&#xff0c;是否能够连接外网&#xff0c;好多旁路由设置完了&#xff0c;发现还不能远程好多就是旁路由本…