MySQL 索引失效详解

一、MySQL索引失效原因汇总

  1. 隐式的类型转换,索引失效
  2. 查询条件包含or,可能导致索引失效
  3. like通配符可能导致索引失效
  4. 查询条件不满足联合索引的最左匹配原则
  5. 在索引列上使用mysql的内置函数
  6. 对索引进行列运算(如,+、-、*、/)
  7. 索引字段上使用 (! = 或者< >),索引可能失效
  8. 索引字段上使用is null, is not null,索引可能失效
  9. 左右连接,关联的字段编码格式不一样
  10. 优化器选错了索引

二、MySQL索引失效原因分析

(1)隐式的类型转换,索引失效

如:普通索引userId是string,查询时用了where userId = 123;结果不走索引;如果给数字加上’',也就是说,传的是一个字符串呢,当然是走索引。
解释:为什么第一条语句未加单引号就不走索引了呢?这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,
MySQL会做隐式的类型转换,把它们转换为浮点数再做比较。隐式的类型转换,索引会失效。

(2)查询条件包含or,可能导致索引失效

如:其中userId加了索引,但是age没有加索引的。我们使用了or,以下SQL是不走索引的,如下:select * from user where userId = ‘123’ or age = ‘18’;
解释:对于or+没有索引的age这种情况,假设它走了userId的索引,但是走到age查询条件时,它还得全表扫描,也就是需要三步过程:全表扫描+索引扫描+合并。
如果它一开始就走全表扫描,直接一遍扫描就完事。Mysql优化器出于效率与成本考虑,遇到or条件,让索引失效,看起来也合情合理嘛。
注意:如果or条件的列都加了索引,索引可能会走也可能不走,大家可以自己试一试哈。
但是平时大家使用的时候,还是要注意一下这个or,学会用explain分析。遇到不走索引的时候,考虑拆开两条SQL。

(3)like通配符可能导致索引失效

如:like查询以%开头,索引失效,如:select * from user where userId like ‘%123’;
like把%放后面,发现索引还是正常走的,如下:select * from user where userId like ‘123%’;
解释:并不是用了like通配符,索引一定会失效,而是like查询是以%开头,才会导致索引失效。
思考:既然like查询以%开头,会导致索引失效。我们如何优化呢?
1.使用覆盖索引;2.把%放后面

(4)查询条件不满足联合索引的最左匹配原则

MySQl建立联合索引时,会遵循最左前缀匹配的原则,即最左优先。在联合索引中,查询条件满足最左匹配原则时,索引才正常生效。
如果你建立一个(a,b,c)的联合索引,相当于建立了(a)、(a,b)、(a,b,c)三个索引。
前提:联合索引(userId,name)
如:select * from user where name =‘张三’;因为查询条件列name不是联合索引idx_userid_name中的第一个列,索引不生效;
select * from user where userId =‘123’;查询条件满足最左匹配原则时,索引才正常生效。

(5)在索引列上使用mysql的内置函数

如:给login_time加了索引,但是因为使用了mysql的内置函数Date_ADD(),索引直接失效,
select * from user where DATE_ADD(login_time,INTERVAL 1 DAY)=‘2022-05-22 00:00:00’;
思考:一般这种情况怎么优化呢?可以把内置函数的逻辑转移到右边,如下:
select * from user where login_time = DATE_ADD(‘2022-05-22 00:00:00’,INTERVAL 1 DAY);

(6)对索引进行列运算(如,+、-、*、/)

如:给age加了索引,但是因为它进行运算,索引直接失效,如:select * from user where age -1 = 10;
所以不可以对索引列进行运算,可以在代码处理好,再传参进去。

(7)索引字段上使用 (! = 或者< >),索引可能失效

如:给age加了索引,但是使用了!= 或者< >,not in这些时,索引如同虚设。如下:select * from user where age != 18;
解释:其实这个也是跟mySQL优化器有关,如果优化器觉得即使走了索引,还是需要扫描很多很多行的话,它觉得不划算,不如直接不走索引。
平时我们用!= 或者< >,not in的时候,留点心眼哈。

(8)索引字段上使用is null, is not null,索引可能失效

如:给单个name字段加上索引,并查询name为非空的语句,其实会走索引的,如下:select * from user where name is not null;
单个card字段加上索引,并查询card为非空的语句,其实会走索引的,如下:select * from user where card is not null;
注意:但是它两用or连接起来,索引就失效了,如下:select * from user where name is not null or card is not null;
解释:很多时候,也是因为数据量问题,导致了MySQL优化器放弃走索引。同时,平时我们用explain分析SQL的时候,如果type=range,要注意一下哈,
因为这个可能因为数据量问题,导致索引无效。

(9)左右连接,关联的字段编码格式不一样

前提:user表的name字段编码是utf8mb4,而user_job表的name字段编码为utf8。
如:执行左外连接查询,user_job表还是走全表扫描,如下:select * from user a join user_job b on a.name = b.name;
如果把它们的name字段改为编码一致,相同的SQL,还是会走索引。

(10)优化器选错了索引

解释:MySQL 中一张表是可以支持多个索引的。你写SQL语句的时候,没有主动指定使用哪个索引的话,用哪个索引是由MySQL来确定的。
思考:我们日常开发中,不断地删除历史数据和新增数据的场景,有可能会导致MySQL选错索引。那么有哪些解决方案呢?
1.使用force index 强行选择某个索引
2.修改你的SQl,引导它使用我们期望的索引
3.优化你的业务逻辑
4.优化你的索引,新建一个更合适的索引,或者删除误用的索引。

关注林哥,持续更新哦!!!★,°:.☆( ̄▽ ̄)/$:.°★ 。

MySQL 索引失效详解相关推荐

  1. MySQL索引原理详解

    MySQL索引原理详解 索引的本质 索引的分类 Hash 索引 二叉树 B树(二三树) B+树 主键目录 索引页 索引页的分层 非主键索引 回表 索引的本质 索引的本质是一种排好序的数据结构. 索引的 ...

  2. 【肝帝一周总结:全网最全最细】☀️Mysql 索引数据结构详解与索引优化☀️《❤️记得收藏❤️》

    [肝帝一周总结:全网最全最细]☀️Mysql 索引数据结构详解与索引优化☀️<❤️记得收藏❤️> 目录

  3. 数据结构可视化与MySQL索引视频详解

    数据结构 必看: 数据结构可视化:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html MySQL索引视频详解:https:// ...

  4. 1万条数据大概占多大空间_Java互联网架构-性能优化Mysql索引数据结构详解

    欢迎关注头条号:java小马哥 周一至周日下午三点半!精品技术文章准时送上!!! 精品学习资料获取通道,参见文末 一,索引数据结构红黑树,Hash,B+树详解 索引是帮助MySQL高效获取数据的排好序 ...

  5. Mysql索引优化详解

    索引优化分析详解: http://liucw.cn/2018/01/07/mysql/%E7%B4%A2%E5%BC%95%E4%BC%98%E5%8C%96%E5%88%86%E6%9E%90/

  6. 玩转Mysql系列 - 第22篇:mysql索引原理详解

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...

  7. MySQL索引使用详解

    1 索引分类 MySQL索引分为普通索引.唯一索引.主键索引.组合索引.全文索引.索引不会包含有null值的列,索引项可以为null(唯一索引.组合索引等),但是只要列中有null值就不会被包含在索引 ...

  8. 深入理解Mysql - 索引原理详解

    一.什么是数据库索引 数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询.更新数据库表中数据. 二.索引存储模型的推演 1,有序数组 过程:按照顺序由小往大或反向查询. 缺点 ...

  9. MySQL索引类型详解,让MySQL高效运行起来

    为什么80%的码农都做不了架构师?>>>    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对 ...

最新文章

  1. 高通APQ8074 spi 接口配置
  2. 燃烧学往年精选真题解析 2018-01-01
  3. docker挂载文件躺过的坑
  4. 计算机专业笔记本需要小键盘吗,笔记本电脑小键盘数字0不能用
  5. werkzeug routing.Map
  6. Kubernetes详解(十五)——Pod对象创建过程
  7. 安装SQL2000时弹出“以前的某个程序安装已在安装计算机上创建挂起的文件操作、、、”...
  8. mysql二进制还原表_MySQL 二进制文件恢复数据基础版本
  9. 异星工场服务器直连,Factorio 异星工厂 搭建服务器
  10. 三菱FX系列PLC以太网连接组态王软件
  11. (unsigned char) ~0 1
  12. 数电设计--交通灯控制系统
  13. MRCP协议-提供语音识别(ASR)与语音合成服务(TTS)
  14. 为什么要使用微信活码?
  15. antd input框获取焦点点击输入历史保存的值后,背景颜色变成淡蓝色解决方法,输入框获取焦点后边框会有一圈淡蓝色光边
  16. 心态-《积极的力量》书中的精髓:如何保持积极乐观的心态,从而提升我们的幸福感?
  17. 【网络工程】浅显易懂TCP/IP协议 三次握手 四次挥手
  18. HTML5之canvas剪切图片
  19. WPF导出发布安装包,无法验证发行者解决办法
  20. Gavin老师Transformer直播课感悟 - 通过Rasa Interactive对Rasa对话机器人项目实战之ConcertBot源码、流程及对话过程解密(四十三)

热门文章

  1. Substance Painter Essential Training Substance Painter基础教程 Lynda课程中文字幕
  2. SessionStorage如何存放对象
  3. Python数据转换-有符号短整型转换无符号短整型
  4. 考研 计算机组成原理大纲,2020计算机组成原理考研大纲解析
  5. Martingale - Python 模拟加倍下注
  6. Linux 监控工具 tsar(转)
  7. VMware-ESXi、vCenter、vSphere Client、Datastorage部署
  8. winform实现关闭或最小化隐藏到右下脚
  9. 一篇文章说清Python数据分析,这个学习路线绝了
  10. 大连工作后到外省就业要办的手续