MySQL数据库入门到大牛之索引失效的几种情况浅析

 更新时间:2026年11月06日 10:17:05   作者:连杰李  
MySQL索引失效是数据库性能优化中常见的问题,理解索引失效的场景对于提升查询效率至关重要,这篇文章主要介绍了MySQL数据库入门到大牛之索引失效的几种情况的相关资料,需要的朋友可以参考下

一、个人总结

  • 1、AND 连接的列,有联合索引,单列索引失效。
    • WHERE name = ‘JetLi’ and age = 25。
    • 如果建立了 (name, age) 联合索引,通常不需要再单独建立 name 单列索引,否则会造成冗余,增加写入成本。
  • 2、搜索条件没有使用联合索引最左边的列,联合索引失效。
    • WHERE age = 25。
    • name 和 age 有联合索引,联合索引失效。
  • 3、对列进行运算、函数、类型转换会导致索引失效。
    • WHERE name = 123 (name 是字符串类型,123 是数字)。
  • 4、范围条件右边的列,索引失效。
    • WHERE age > 25 AND name = ‘JetLi’。
    • age 和 name 有联合索引。联合索引失效。
    • 建议把范围查询的字段放在联合索引的最后,即 name 和 age。
  • 5、不等于条件,索引失效。
    • WHERE age <> ‘25’。
    • age 是不等于条件,age 单列索引失效。
  • 6、is not null,索引失效。
    • WHERE age is not null。
    • age 单列索引失效。
  • 7、通配符开头,索引失效。
    • WHERE name like ‘%Jet’。
    • name 单列索引失效。
  • 8、OR 前后存在没有索引的列,索引失效。
    • WHERE name = ‘JetLi’ OR age = 25。
    • name 有单列索引,age 没有单列索引,name 上的单列索引失效。
  • 9、数据库和表字符集不一致,索引失效。
    • 两个字符集不一致的表连接查询
  • 10、InnoDB 存储引擎,如果使用主键自增,而我们插入数据的主键忽大忽小,索引失效。
    • 这个不算索引失效,但是这种情况也会影响效率。

二、AI 验证优化

你的总结已经涵盖了 MySQL 索引失效的绝大多数核心场景,非常棒!特别是对联合索引最左前缀原则、函数操作以及类型转换的总结非常准确。

1、 完善后的“索引失效清单”

为了方便你记忆,我把我们讨论的内容整理成一个表格:

失效场景典型 SQL 示例核心原因优化建议
最左前缀原则WHERE age=25 (联合索引为 (name,age))跳过了联合索引最左列调整查询条件或索引顺序
索引列计算/函数WHERE YEAR(create_time) = 2023破坏了索引有序性将计算移到等号右边
类型转换WHERE phone=138... (phone为字符串)隐式转换导致全表扫描保持数据类型一致
左模糊查询WHERE name LIKE '%Li'B+树无法反向匹配改为右模糊 LIKE 'Li%'
OR 条件陷阱WHERE indexed=1 OR not_indexed=2无索引列导致全表扫描使用 UNION 拆分查询
范围查询阻断WHERE a>1 AND b=2 (联合索引 (a,b))范围查询后索引断裂将范围字段放在联合索引末尾
不等于操作WHERE status != 'active'需扫描大部分数据尽量用 IN 列举代替
IS NOT NULLWHERE name IS NOT NULL优化器认为全表扫描更快字段设置为 NOT NULL 默认空值
字符集不一致JOIN 时两边字符集不同需要做隐式转换统一表和字段的字符集

2、 总结

你的总结已经非常全面了,以上补充主要是为了严谨性。

最后给你一个排查索引问题的终极建议:
永远不要靠猜!使用 EXPLAIN 或 EXPLAIN FORMAT=JSON 命令来查看执行计划。

  • 看 type 列:如果是 ALL 就是全表扫描(索引失效);如果是 ref/range/const 说明用了索引。
  • 看 key 列:到底用了哪个索引。
  • 看 Extra 列:是否有 Using where; Using filesort 或 Using temporary,这些也是性能杀手。

总结

到此这篇关于MySQL数据库入门到大牛之索引失效的几种情况的文章就介绍到这了,更多相关MySQL索引失效情况内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解析Mysql多表查询的实现

    解析Mysql多表查询的实现

    本篇文章是对Mysql多表查询的实现进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL如何根据关联表数据实现批量更新本表多个字段

    MySQL如何根据关联表数据实现批量更新本表多个字段

    本文介绍MySQL中基于主键关联实现跨表批量更新多个字段的方法,以testtable01和testtable02为例,演示如何通过JOIN语法将源表的attr01、attr02字段安全、高效地更新至目标表对应行,有需要的可以参考下
    2026-10-10
  • mysql存储过程用法实例分析

    mysql存储过程用法实例分析

    这篇文章主要介绍了mysql存储过程用法,结合实例形式简单分析了mysql存储过程的概念、功能、定义、执行、调用等相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • 浅析MySQL动态查询条件导致索引失效问题优化

    浅析MySQL动态查询条件导致索引失效问题优化

    这篇文章将结合真实业务场景,深入浅出地剖析了 MySQL 动态查询如何导致索引失效,并提供了 Java 实战方案,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • MySQL存储引擎 InnoDB与MyISAM的区别

    MySQL存储引擎 InnoDB与MyISAM的区别

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。
    2014-03-03
  • MySQL sum后再计算percentage的多种解决办法

    MySQL sum后再计算percentage的多种解决办法

    这篇文章主要介绍了MySQL sum后再计算percentage的多种解决办法,over() 函数,Cross Join,Select 嵌套查询以及 with 函数处理,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-06-06
  • MySql中的索引失效、回表解析问题

    MySql中的索引失效、回表解析问题

    这篇文章主要介绍了MySql中的索引失效、回表解析问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • MySQL分批插入/更新数据方式

    MySQL分批插入/更新数据方式

    文章介绍了如何使用MySQL分批插入/更新数据,以避免大 SQL 语句导致的更新失败或抛出异常,通过手写分批代码或使用 Guava 库的 partition 方法,可以简化批量操作,同时,文章还提到如何使用 partition 方法进行分组查询
    2025-02-02
  • MySQL索引与事务定义到使用详解

    MySQL索引与事务定义到使用详解

    这篇文章主要介绍了MySQL数据库索引事务,索引是为了加速对表中数据行的检索而创建的一种分散的存储结;事物是属于计算机中一个很广泛的概念,一般是指要做的或所做的事情,下面我们就一起进入文章了解具体内容吧
    2022-12-12
  • mysql8新特性之binlog_expire_logs_seconds浅析

    mysql8新特性之binlog_expire_logs_seconds浅析

    MySQL8中新增了不少新特性,这些特性提高了数据库的安全性和性能,使数据库管理员能够更灵活地进行账户管理工作,下面这篇文章主要给大家介绍了关于mysql8新特性之binlog_expire_logs_seconds的相关资料,需要的朋友可以参考下
    2023-02-02

最新评论