mysql的索引在使用不当情况下会失效.

比如:使用最佳左前缀法则,大于号右边的索引会失效,使用like索引会失效,当准备面试的时候我们为了应付面试的的时候往往会去找到这些面试题目的答案,但是往往不会去思考,为什么会失效?

今天文章就会仔细的分析下,什么情况下mysql的索引会失效,我们都知道,索引失效的情况下都是针对联合索引

如下图:

一个联合索引的节点上面有两个键值对,现在假设联合索引的字段是有a和b组成的,那么现在从上面的图可以看到:2 和 4 就代表我们的a和b连个字段组合成了一个联合索引,然后可以仔细观察叶子节点,左边的叶子节点都是有序排列的,并且由小到大,所以可以看到a的优先级大于b的优先级,而右边的则是无序的

 

好的,现在我们可以分析下,为什么是最左前缀法则失效?为什么大于号右边的会失效?为什么like会失效?

我现在新建一个测试用户表;

创建了一个复合索引由 phone和len_id和region_id组成的idx_phone_lan_region,然后我们可是测试一下

首先我们测试一个遵循最佳做前缀法则;

执行结果如下;

explan可以看到这条sql是执行了索引的,rows等于1,type=ref

然后我们去掉 手机号再查询一次;

可以看到rows是扫描了一行数据,当然我这个用户表是没有数据的,所以只能看到rows=1,然后type=all,说明这条sql没有走索引,

所以我们分析下,为什么没有走索引,还是由上面的那个图我们可以看出;

我们知道联合索引再b+树上的排序是先排a,当a相等的情况下再排b,然后我们刚刚看到了,条件查询存在手机号的遵循最佳左前缀法则,首先a字段再b+树上面是有序的,就能定位到a所在的节点,就是通过二分查找发找到a,当我们查找了第一个字段,然后再来查找第二个字段b,从图可以看出,当a相同的情况下b也是有序的,这是时候,我们的a已经确定了,那么我们就可以再a的基础上用二分查找发去查找b,这种情况下b也是有序的,所以它也能查找到,所以这个遵循最佳做前缀法则的sql分析下来是没有问题的,然后我们来分析不遵循最佳最佳左前缀法则的sql;

问题出在哪里?

只有当我们a相等的情况下,b才是有序的,而上面的当我们把电话号码去掉的情况下,b就是无序的,缺少b执行的索引的存在条件,没有a的情况下,b肯定是无序的,所以在无序情况下我们无法找到b这个值,所以只能进行全表扫描,不会搜索引

这就是为什么要遵循最佳左前缀法则了

然后我们看看,范围查找的右边,为什么索引会失效;还是看这个图

首先我们看叶子节点,查找a>1 b=1的数据,可以看到a大于1的数据由2,3,4,分别在叶子节点可以看到,然后我们再去找b=1的数据,而a>1的数据对应的b的数据是没有序的,这个无序的不仅仅体现在叶子节点上而且还体现在非叶子节点上,所以这种情况下b无序,还是无法进行索引匹配,

当我们% 放在左边,放在右边都是不走索引的,那么这又是什么原因呢?

首先解释下% 的含义,首先我们这个%放在右边,是去查找以1 开头的数据,例如,111222,这个数据就可以查询出来,但是当我们变成222111,就查询不出来,所以这个%的意思就是这个意思,所以百分号分别在左边,右边,还是两边,分别叫做,前缀,后缀,中缀,当我们一个字符串存在b+树里面存储的时候,也是按照字母的大小去排序的,如下图

你去查找以a开头的字符串,可以按照a的顺序查找到。所以当你加上%就不是前缀法则了,所以这就是like失效的原理,所以这里就可以推理出in 为什么会失效,or 为什么会失效!

所以可以总结下;

  1. 如果是复合索引,叶子节点不仅保存了复合索引的值,还有主键的值,这就是当你使用覆盖索引的时候,加上主键也会用到索引的原因

  2. 如果是模糊查询,如果查询字段不包括索引字段,只有当%放到左边时候才会用到索引,但如果是覆盖索引,则会用到覆盖索引,

  3. 返回查询如果复合做前缀法则,而且查询的数据比较少的情况下,即使没有用到覆盖索引,也会走索引,但是如果数据过多,则会全表扫描

凡事不能二分查找的情况下都属于索引失效的情况

徐卖狼

微信号 :corey

mysql索引失效_MySQL索引失效的底层原理相关推荐

  1. mysql索引失效_MySQL索引失效的底层原理详解,终于有人讲清楚了

    前言 吊打面试官又来啦,今天我们讲讲MySQL索引为什么会失效,很多文章和培训机构的教程,都只会告诉你,在什么情况下索引会失效. 比如:没遵循最佳左前缀法则.范围查询的右边会失效.like查询用不到索 ...

  2. mysql数据索引失效_MySQL索引失效的几种情况

    1.索引无法存储null值 a.单列索引无法储null值,复合索引无法储全为null的值. b.查询时,采用is null条件时,不能利用到索引,只能全表扫描. 为什么索引列无法存储Null值? a. ...

  3. mysql 子查询索引失效_mysql 索引失效的情况

    索引失效的几种情况 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 2.对于多列索引,不是使用 ...

  4. mysql的索引优化_MySQL索引优化与分析(重要)

    建表SQL CREATE TABLE staffs ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR (24) NULL DEFAULT '' COM ...

  5. mysql多索引结构_MySQL 索引结构

    谈到 MYSQL 索引服务端的同学应该是熟悉的不能再熟悉,新建表的时候怎么着都知道先来个主键索引,对于经常查询的列也会加个索引加快查询速度.那么 MYSQL 索引都有哪些类型呢?索引结构是什么样的呢? ...

  6. mysql傻瓜教程_mysql索引的使用傻瓜教程_MySQL

    bitsCN.com mysql教程:索引的使用 1. 索引(index)是帮助MySQL高效获取数据的数据结构. 它对于高性能非常关键,但人们通常会忘记或误解它. 索引在数据越大的时候越重要.规模小 ...

  7. mysql验证索引正确性_mysql索引测试

    生成测试数据: 创建表用于测试: /*创建t_user表用于数据测试*/ DROP TABLE IF EXISTS t_user; CREATE TABLE `t_user` ( `id` bigin ...

  8. mysql设置id值为索引值_MySQL 索引

    一.索引作用 提供了类似于书中目录的作用,目的是为了优化查询 (一).索引种类 1.B树索引(Balance Tree) 作用 Btree的设计理念,就是让查询能够快速锁定范围,特别适合于范围查询. ...

  9. mysql索引总结_mysql 索引类型以及创建

    文章归属:http://feiyan.info/16.html  自己还是小白,从借鉴别人的东西开始学习. 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没 ...

  10. MySQL索引优化是什么意思?底层原理是什么?

    MySQL索引优化是指通过对MySQL数据库中的索引进行优化,提高查询性能和效率的过程.索引是一种数据库对象,它可以提高查询数据的速度,通过创建索引可以使得查询操作更快速.更高效. 底层原理是:MyS ...

最新文章

  1. android 常用 style,Android中 Styles和Themes
  2. 微软已暂时停用你的账户_微软小冰公众号因违规被停用;安卓版隔空投送要来了...
  3. TensorFlow------学习篇
  4. 前端学习(3205):对state的理解
  5. 求一份100行左右的C语言程序,求4个C语言程序 每个100行左右 大一水平的
  6. 企业实战_14_MyCat跨分片查询_全局表
  7. 计算机基础.doc,大学生计算机基础.doc
  8. 机器学习实战(三)朴素贝叶斯NB(Naive Bayes)
  9. fragment中嵌套viewpager,vierpager中用fragment不显示数据
  10. python层次聚类_python中做层次聚类,使用scipy.cluster.hierarchy.fclusterdata方法 | 学步园...
  11. asp.net/net/c#电子购物商城系统-成品
  12. APP抓包加密破解(hook)
  13. 关于双网卡同时连接内外网
  14. 2020 全国大学生数学建模竞赛C题思路+代码
  15. 多年的人工智能安全机制争议 检察官、行刑者与道德家这么表示
  16. iPhone开发 - 3D - 建立3D界面(上)
  17. 装备制造业ERP软件如何帮助企业做好物料齐套管理?
  18. 电脑运行内存8g够用吗
  19. oracle中job_queue_processes 表,参数job_queue_processes与Oracle jobs - 一沙弥的世界
  20. SpringCloud(完结)

热门文章

  1. 使用webpack打包vue工程
  2. Ubuntu安装Sublime Text并输入中文
  3. 【poi xlsx报错】使用POI创建xlsx无法打开
  4. 使用ISA实现用户级验证(1~3篇)
  5. WebBrowser内核指定
  6. Twitter的分布式自增ID算法snowflake (Java版)
  7. Druid 配置_配置WebStatFilter
  8. StackExchange.Redis 使用-配置
  9. RequiredFieldValidator 根据group组来触发验证
  10. 【已解决】github中git push origin master出错:error: failed to push some refs to(亲测)