为了验证 MySQL 中哪些情况下会导致索引失效,我们可以借助 explain 执行计划来分析索引失效的具体场景。

explain 使用如下,只需要在查询的 SQL 前面添加上 explain 关键字即可,如下图所示:

而以上查询结果的列中,我们最主要观察 key 这一列,key 这一列表示实际使用的索引,如果为 NULL 则表示未使用索引,反之则使用了索引。

以上所有结果列说明如下:

  • id — 选择标识符,id 越大优先级越高,越先被执行;
  • select_type — 表示查询的类型;
  • table — 输出结果集的表;
  • partitions — 匹配的分区;
  • type — 表示表的连接类型;
  • possible_keys — 表示查询时,可能使用的索引;
  • key — 表示实际使用的索引;
  • key_len — 索引字段的长度;
  • ref— 列与索引的比较;
  • rows — 大概估算的行数;
  • filtered — 按表条件过滤的行百分比;
  • Extra — 执行情况的描述和说明。

其中最重要的就是 type 字段,type 值类型如下:

  • all — 扫描全表数据;

  • index — 遍历索引;

  • range — 索引范围查找;

  • index_subquery — 在子查询中使用 ref;

  • unique_subquery — 在子查询中使用 eq_ref;

  • ref_or_null — 对 null 进行索引的优化的 ref;

  • fulltext — 使用全文索引;

  • ref — 使用非唯一索引查找数据;

  • eq_ref — 在 join 查询中使用主键或唯一索引关联;

  • const — 将一个主键放置到 where 后面作为条件查询, MySQL 优化器就能把这次查询优化转化为一个常量,如何转化以及何时转化,这个取决于优化器,这个比 eq_ref 效率高一点。

    创建测试表和数据

    为了演示和测试那种情况下会导致索引失效,我们先创建一个测试表和相应的数据:

    -- 创建表
    drop table if exists student;
    create table student(id int primary key auto_increment comment '主键',sn varchar(32) comment '学号',name varchar(250) comment '姓名',age int comment '年龄',sex bit comment '性别',address varchar(250) comment '家庭地址',key idx_address (address),key idx_sn_name_age (sn,name,age)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    -- 添加测试数据
    insert into student(id,sn,name,age,sex,address) values(1,'cn001','张三',18,1,'高老庄'),(2,'cn002','李四',20,0,'花果山'),(3,'cn003','王五',50,1,'水帘洞');
    

    当前表中总共有 3 个索引,如下图所示:

    PS:本文以下内容基于 MySQL 5.7 InnoDB 数据引擎下。

索引失效情况1:非最左匹配

最左匹配原则指的是,以最左边的为起点字段查询可以使用联合索引,否则将不能使用联合索引。 我们本文的联合索引的字段顺序是 sn + name + age,我们假设它们的顺序是 A + B + C,以下联合索引的使用情况如下:

从上述结果可以看出,如果是以最左边开始匹配的字段都可以使用上联合索引,比如:

  • A+B+C

  • A+B

  • A+C

    其中:A 等于字段 sn,B 等于字段 name,C 等于字段 age。

而 B+C 却不能使用到联合索引,这就是最左匹配原则。

索引失效情况2:错误模糊查询

模糊查询 like 的常见用法有 3 种:

  1. 模糊匹配后面任意字符:like '张%'
  2. 模糊匹配前面任意字符:like '%张'
  3. 模糊匹配前后任意字符:like '%张%'

而这 3 种模糊查询中只有第 1 种查询方式可以使用到索引,具体执行结果如下:

索引失效情况3:列运算

如果索引列使用了运算,那么索引也会失效,如下图所示:

索引失效情况4:使用函数

查询列如果使用任意 MySQL 提供的函数就会导致索引失效,比如以下列使用了 ifnull 函数之后的执行计划如下:

索引失效情况5:类型转换

如果索引列存在类型转换,那么也不会走索引,比如 address 为字符串类型,而查询的时候设置了 int 类型的值就会导致索引失效,如下图所示:

索引失效情况6:使用 is not null

当在查询中使用了 is not null 也会导致索引失效,而 is null 则会正常触发索引的,如下图所示:

总结

导致 MySQL 索引失效的常见场景有以下 6 种:

  1. 联合索引不满足最左匹配原则。
  2. 模糊查询最前面的为不确定匹配字符。
  3. 索引列参与了运算。
  4. 索引列使用了函数。
  5. 索引列存在类型转换。
  6. 索引列使用 is not null 查询。

什么情况会导致 MySQL 索引失效?相关推荐

  1. like左匹配索引失效_导致MySQL索引失效的一些常见写法总结

    前言 最近一直忙着处理原来老项目遗留的一些SQL优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢SQL,导致MySQL的CPU资源飙升,基于此,给大家简单分享下这些比较使用 ...

  2. 导致Mysql索引失效的情况

    1.用!=或者<>导致索引失效 1 2 3 select * from table1 where name != 'zhangsan' select * from table1 where ...

  3. mysql索引失效_导致MySQL索引失效的几种常见写法

    最近一直忙着处理原来老项目遗留的一些SQL优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢SQL,导致MySQL的CPU资源飙升,基于此,给大家简单分享下这些比较使用的易于 ...

  4. Mysql索引使用情况_介绍mysql索引失效的情况

    mysql视频教程栏目索引失效的情况. 索引对于MySQL而言,是非常重要的篇章.索引知识点也巨多,要想掌握透彻,需要逐个知识点一一击破,今天来先来聊聊哪些情况下会导致索引失效. 图片总结版 相关免费 ...

  5. 导致 MySQL 索引失效

    1.索引失效情况1:非最左匹配 最左匹配原则指的是,以最左边的为起点字段查询可以使用联合索引,否则将不能使用联合索引. 我们本文的联合索引的字段顺序是 sn + name + age,我们假设它们的顺 ...

  6. 详解MySQL索引失效的几种情况

    MySQL索引是提高查询效率的重要手段.索引失效会导致查询效率下降,甚至全表扫描,影响数据库性能.以下是可能导致MySQL索引失效的情况: 1. 使用or操作符 当where语句中使用or操作符并且o ...

  7. mysql 索引失效分析

    大神总结的索引失效一句话理解后就不用看我下面的文章了,这就是 "模型数空运最快" 模:模糊查询like  %在前面索引失效 型:数据类型有变化索引失效 数:索引列使用了函数索引失效 ...

  8. MySQL索引失效的9种情况(针对InnoDB存储引擎)

    前言 MySQL中提高查询性能的最有效的方式之一就是对数据表合理的设计索引,优秀的索引的设计方案很大程度上可以提高查询的性能. 因此,索引对查询的速度有着至关重要的影响. 为了尽量的使优化器用到我们的 ...

  9. MySQL表字段字符集不同导致的索引失效问题

    MySQL表字段字符集不同导致的索引失效问题 转自:MySQL表字段字符集不同导致的索引失效问题 1. 概述 昨天在一位同学的MySQL机器上面发现了这样一个问题,MySQL两张表做left join ...

最新文章

  1. Automatically highlight current page in menu via Javascript
  2. KMM 搭建环境,并运行安卓和ios
  3. Hsiaoyang: Google与站点地图Sitemap
  4. (转载)C++之tinyXML使用
  5. RAID冗余技术的介绍AND实现
  6. jsf 自定义属性_如何在JSF中实现自定义密码强度指示器
  7. 为什么虚拟机上一运行就显示程序停止_五分钟学Java:如何学习Java面试必考的JVM虚拟机...
  8. python树的实现
  9. MATLAB程序实验3,实验3_matlab程序设计实验.doc
  10. SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)
  11. 吴恩达机器学习作业 1线性回归
  12. 2021年中国乙醛市场趋势报告、技术动态创新及2027年市场预测
  13. pcie读写ddr_一文详解PCIe内存空间到AXI内存空间的转换
  14. 汽车后市场的大数据引擎谁人可造
  15. 最新美女COS写真网站整站源码下载+实测可用/带数据
  16. 2019软科【世界一流计算机学科排名】公布!
  17. 得到头条【四线城市宜宾,靠什么逆袭?】
  18. CS224W-图神经网络 笔记5.2:Spectral Clustering - 谱聚类主要思想及关键结论的证明
  19. Arch Linux Arm 安装Yaourt
  20. MATLAB数学实验——Jacobi迭代法Gauss-Seidel迭代法

热门文章

  1. Linux文件权限大全(chmod+chown)
  2. Winsock损坏修复
  3. Lumiprobe生物素亚磷酰胺(羟脯氨酸)说明书
  4. springCloud笔记
  5. 高通平台P2P--P2P验证问题
  6. GAMS语法初级教程
  7. JAVA-冒泡排序详解
  8. 吃鸡7月5号服务器维护,绝地求生7月5日更新维护公告 吃鸡更新内容汇总
  9. HTML记事本滚动字幕怎么弄,如何利用Dreamweaver制作滚动字幕_Dreamweaver制作_字幕设计_滚动字幕_课课家...
  10. 并发编程思维导图分享(包含详细知识点)