当前位置: 首页 > web >正文

MySQL索引失效场景

MySQL 索引优化是提升查询性能的关键手段之一,但有时使用不当会导致索引失效。今天我们一起来看看哪些情况下索引会失效。

1、联合索引没有使用最左前缀

  • 失效示例:联合索引 (a,b,c)
SELECT * FROM table WHERE b=1 AND c=2;  -- ❌ 索引失效
  • 正确写法: 
WHERE a = ?  -- ✅
WHERE a = ? AND b = ?  -- ✅
WHERE a = ? AND b = ? AND c = ?  -- ✅
-- ps:MySQL 对 = 条件的列,优化器会按索引顺序重组 WHERE 条件,比如:
WHERE b = ? AND a = ? AND c = ?  -- ✅ 也是会走索引的

2、在索引列上使用函数或运算

  • 失效示例
SELECT * FROM orders WHERE YEAR(create_time) = 2025;  --  ❌ 索引失效
  • 正确写法: 
-- 改为范围查询
SELECT * FROM orders 
WHERE create_time BETWEEN '2025-01-01' AND '2025-12-31';  -- ✅

3、隐式类型转换

  • 失效示例:字段类型与查询值类型不一致
-- user_id 是 VARCHAR 类型
SELECT * FROM users WHERE user_id = 1001;  -- ❌ 索引失效(数字转字符串,MySQL 需将列值转为数字再比较,无法走索引)
  • 正确写法: 
SELECT * FROM users WHERE user_id = '1001';  -- ✅ 保持类型一致

4、LIKE 查询左边加了通配符 %

  • 失效示例:
SELECT * FROM users WHERE name LIKE '%王';  -- ❌ 索引失效
  • 正确写法:
SELECT * FROM users WHERE name LIKE '王%';  -- ✅ 可以使用索引

5、OR 连接非索引列

  • 失效示例:
-- age 有索引,address 无索引
SELECT * FROM users WHERE age > 25 OR address = '北京';  -- ❌ 索引失效
  • 正确写法:
-- 拆分成 UNION
SELECT * FROM users WHERE age > 25 
UNION
SELECT * FROM users WHERE address = '北京';  -- ✅

6、使用 IS NULL / IS NOT NULL

SELECT * FROM users WHERE name IS NULL;  -- ✅ 通常能用索引
SELECT * FROM users WHERE name IS NOT NULL;  -- ❌ 索引不一定用,通常不能用

7、NOT IN / NOT EXISTS

  • 失效示例:
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM blacklist); -- ❌ 索引失效
  • 正确写法:
-- 改用 LEFT JOIN
SELECT u.* FROM users u
LEFT JOIN blacklist b ON u.id = b.user_id
WHERE b.user_id IS NULL;  -- ✅

有时我们会发现,明明是正确的使用方法,但是看执行计划还是没走索引。有可能是数据量比较少时,MySQL自带的优化器认为全表扫描更快。当然,索引失效的情况,我只是列举了几种常见的。还有 重复索引、索引统计信息过期、范围查询中断联合索引 等等,也会导致索引失效。我们可以根据具体情况进行分析,对于执行计划的解释的,大家可以参考另一篇博文 MySQL EXPLAIN 关键字详解。

资本低潮终究会过去。-- 烟沙九洲

http://www.xdnf.cn/news/14855.html

相关文章:

  • OpenWrt | 使用 Docker 运行 iperf3
  • 深度解析基于贝叶斯的垃圾邮件分类
  • android BottomSheet及AlertDialog的几种material3 常见ui的用法
  • 链表题解——设计链表【LeetCode】
  • 贪心算法在C++中的应用与实践
  • 机器学习-- 神经网络
  • 认识 Spring AI
  • 【Springai】项目实战进度和规划
  • Android阴影效果的艺术与实现:从入门到精通
  • 【冷知识】Spring Boot 配置文件外置
  • [15-2] 读写内部FLASH读取芯片ID 江协科技学习笔记(20个知识点)
  • YOLOv13:最新的YOLO目标检测算法
  • AlpineLinux安装部署MongoDB
  • Flutter 布局之 IntrinsicHeight 组件
  • 浪潮和曙光服务器的ipmi配置教程
  • jenkins集成sonarqube(使用token进行远程调用)
  • 【硬核数学 · LLM篇】3.1 Transformer之心:自注意力机制的线性代数解构《从零构建机器学习、深度学习到LLM的数学认知》
  • Springboot + vue + uni-app小程序web端全套家具商场
  • Junit_注解_枚举
  • 网络安全2023—新安全新发展
  • Java 案例 6 - 数组篇(基础)
  • 【知识图谱构建系列7】:结果评价(1)
  • DBeaver 设置阿里云中央仓库地址的操作步骤
  • 基于hive的电商用户行为数据分析
  • Webpack原理剖析与实现
  • 【嵌入式ARM汇编基础】-ELF文件格式内部结构详解(三)
  • 《AI for Science:深度学习如何重构基础科学的发现范式?》
  • 用户行为序列建模(篇十)-【加州大学圣地亚哥分校】SASRec
  • mybatis-plus从入门到入土(一):快速开始
  • 【学习】《算法图解》第八章学习笔记:平衡树