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

MySQL索引失效场景分析

MySQL 索引失效的常见原因

在 MySQL 中,即使你为某列建立了索引,也有不少情况会导致索引失效,从而退化为全表扫描,影响查询性能。以下是常见导致索引失效的场景,附有示例说明:


✅ 正常使用索引的前提

  • 查询条件中字段在索引列上。
  • 字段的数据类型与索引字段一致。
  • 没有对索引列进行不必要的函数或运算。
  • 使用了支持索引的操作符,如 =, <, >, BETWEEN, IN 等。
  • 索引列like查询或者复合索引遵循最左匹配原则。

❌ 常见导致索引失效的情况

1. 使用函数或表达式对索引列进行处理

-- 假设 `name` 列有索引
SELECT * FROM user WHERE LEFT(name, 3) = 'Tom';

使用函数 LEFT(name, 3),MySQL 无法利用索引,需要对所有行执行函数运算。

2. 数据类型不一致(隐式转换)

-- phone 为 varchar 类型
SELECT * FROM user WHERE phone = 13800138000;

数字字面量与 varchar 类型对比时,会触发隐式类型转换,导致索引失效。

建议写成:

SELECT * FROM user WHERE phone = '13800138000';

3. 对索引列做运算

-- age 列有索引
SELECT * FROM user WHERE age + 1 = 18;

索引列做了计算,MySQL 无法使用索引。

改写为:

SELECT * FROM user WHERE age = 17;

4. 使用 !=<> 操作符

SELECT * FROM user WHERE age != 30;

!= 会导致索引失效,因为它不能有效筛选范围。

5. 使用 OR 且不是所有字段都有索引

SELECT * FROM user WHERE name = 'Tom' OR age = 30;

如果 nameage 不是都建了索引,可能导致不能使用索引。

改进方法:对 nameage 都建立索引,或改为 UNION 形式。

6. 模糊查询前缀带通配符(如 %abc

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

前面有 %,无法利用索引,只能全表扫描。

推荐使用:

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

7. 多列联合索引未按最左前缀使用

假设建了联合索引 (name, age)

SELECT * FROM user WHERE age = 20; -- ❌ 无法使用索引
SELECT * FROM user WHERE name = 'Tom' AND age = 20; -- ✅ 使用索引

只使用联合索引中的第二列时会失效。

8. 使用 IS NULL / IS NOT NULL 的情况

SELECT * FROM user WHERE name IS NOT NULL;

对于 IS NOT NULL,可能不会使用索引(取决于 MySQL 版本、数据分布)。

9. 使用 NOT IN / NOT EXISTS

SELECT * FROM user WHERE id NOT IN (1, 2, 3);

NOT IN 无法使用索引,尤其当有 NULL 值时。

推荐使用 LEFT JOIN ... IS NULL 替代。

10. 范围条件之后紧跟的索引列失效

-- 联合索引(name, age)
SELECT * FROM user WHERE name > 'Tom' AND age = 20;

范围查询 (name > 'Tom') 之后的 age = 20 不再使用索引。


✅ 如何判断是否使用了索引?

使用 EXPLAIN 分析 SQL 执行计划:

EXPLAIN SELECT * FROM user WHERE name = 'Tom';

关注 keypossible_keysrowsExtra 字段信息。

http://www.dtcms.com/a/262854.html

相关文章:

  • 数据结构笔记5:环形链表的数理分析
  • mysql 小版本升级实战分享
  • 力扣 hot100 Day30
  • 开疆智能CCLinkIE转Canopen网关连接台达伺服驱动器配置案例
  • 自己电脑搭建本地服务器并实现公网访问,内网也能提供互联网连接使用
  • 七层负载均衡和四层负载均衡
  • 打卡day58
  • 数据库表关系设计详解:一对一、一对多、多对多及自关联
  • ShardingSphere完成MySQL集群部署
  • Vue3静态文档资源展示的实现和使用总结
  • 国产车哪款有远程代驾功能?远程代驾+自动驾驶
  • DDoS攻击及其防护方案
  • 超大js文件多层级引用缓存在网络较差的时候无法调用使用问题
  • Rust C++ OpenCV kafka-rs实践
  • 生成式人工智能实战 | 变分自编码器(Variational Auto-Encoder, VAE)
  • 二刷 苍穹外卖day09
  • macos 安装 xcode
  • 借助 KubeMQ 简化多 LLM 集成
  • 深度学习专栏总结
  • 生信分析之流式数据分析:Flowjo 软件核心功能全解析
  • Openssl升级
  • 使用 LoRA 微调大模型:关键参数与最佳实践全解析
  • 深度解析基于贝叶斯的垃圾邮件分类
  • 数字孪生技术为UI前端注入灵魂:实现产品全生命周期的可视化管理
  • 银河麒麟系统上利用WPS的SDK进行WORD的二次开发
  • linux docker 客户端操作数据卷
  • Excel转pdf实现动态数据绑定
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的校园服务平台管理系统,推荐!
  • 【甲方安全建设】敏感数据检测工具 Earlybird 安装使用详细教程
  • 6月30日作业