最左匹配原则

1、先定位该sql的查询条件,有哪些,那些是等值的,那些是范围的条件。

2、等值的条件去命中索引最左边的一个字段,然后依次从左往右命中,范围的放在最后。

分析讲解

1、mysql的索引分为聚簇索引和非聚簇索引,mysql的表是聚集索引组织表。

聚集规则是:有主键则定义主键索引为聚集索引;没有主键则选第一个不允许为NULL的唯一索引;还没有就使用innodb的内置rowid为聚集索引。

非聚集索引也称为二级索引,或者辅助索引。

2、mysql的索引无论是聚集索引还是非聚集索引,都是B+树结构。聚集索引的叶子节点存放的是数据,非聚集索引的叶子节点存放的是非聚集索引的key和主键值。B+树的高度为索引的高度。

3、索引的高度

聚集索引的高度决定了根据主键取数据的理论IO次数。根据非聚集索引读取数据的理论IO次数还要加上访问聚集索引的IO次数总和。实际上可能要不了这么多IO。因为索引的分支节点所在的Page因为多次读取会在mysql内存里cache住。

mysql的一个block大小默认是16K,可以根据索引列的长度粗略估算索引的高度。

sql优化依据

SQL语句中的where条件,使用以上的提取规则,最终都会被提取到Index Key (First Key & Last Key),Index Filter与Table Filter之中。

Index First Key,只是用来定位索引的起始范围,因此只在索引第一次Search Path(沿着索引B+树的根节点一直遍历,到索引正确的叶节点位置)时使用,一次判断即可;

Index Last Key,用来定位索引的终止范围,因此对于起始范围之后读到的每一条索引记录,均需要判断是否已经超过了Index Last Key的范围,若超过,则当前查询结束;

Index Filter,用于过滤索引查询范围中不满足查询条件的记录,因此对于索引范围中的每一条记录,均需要与Index Filter进行对比,若不满足Index Filter则直接丢弃,继续读取索引下一条记录;

Table Filter,则是最后一道where条件的防线,用于过滤通过前面索引的层层考验的记录,此时的记录已经满足了Index First Key与Index Last Key构成的范围,并且满足Index Filter的条件,回表读取了完整的记录,判断完整记录是否满足Table Filter中的查询条件,同样的,若不满足,跳过当前记录,继续读取索引的下一条记录,若满足,则返回记录,此记录满足了where的所有条件,可以返回给前端用户

分析

一条sql语句要执行完成需要经历什么样的过程

当一条sql语句提交给mysql数据库进行查询的时候需要经历以下几步

1、先在where解析这一步把当前的查询语句中的查询条件分解成每一个独立的条件单元

2、mysql会自动将sql拆分重组

3、然后where条件会在B-tree index这部分进行索引匹配,如果命中索引,就会定位到指定的table records位置。如果没有命中,则只能采用全部扫描的方式

4、根据当前查询字段返回对应的数据值

Mysql - 什么情况下索引不会被命中

1、如果条件中有 or ,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

如果出现OR的一个条件没有索引时,建议使用 union ,拼接多个查询语句

2.、like查询是以%开头,索引不会命中

只有一种情况下,只查询索引列,才会用到索引,但是这种情况下跟是否使用%没有关系的,因为查询索引列的时候本身就用到了索引

3. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

4. 没有查询条件,或者查询条件没有建立索引

5. 查询条件中,在索引列上使用函数(+, - ,*,/), 这种情况下需建立函数索引

6. 采用 not in, not exist

7. B-tree 索引 is null 不会走, is not null 会走

mysql 索引未命中_mysql索引命中规则相关推荐

  1. mysql范围条件_MySQL 索引及优化实战(一)

    mysql 随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解索引及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能.高并发和高可用的系统. ...

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

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

  3. mysql匹配数据结构_MySQL索引背后的数据结构及原理

    前两天经历了武汉一行腾讯面试,数据库索引是一个面试热点,在此搜集相关资料,以备学习之用. 下面是一位牛人写得关于数据库索引的精品之作,因为很好,不敢修饰,转载至此与博友共享. 本文以MySQL数据库为 ...

  4. mysql 索引查询_mysql索引的建立和查询语句优化

    首先表内容展示: # 300W条的模拟数据 # 并且没有建立任何索引 不建立索引的查询时间: 以id查询的(4秒多): 以email查询的(4秒多): 建立主键索引后: alter table s1 ...

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

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

  6. mysql索引别名_Mysql索引知识详谈

    1. 索引的重要性 索引之于数据表,相当于检字表于汉语字典,设想让你在没有检字表的情况下从字典中找出一个"武"字,你会多么无助,如果用检字表,我们一眼就能找出它在第509页 数据库 ...

  7. MySQL建立的索引看_MYSQL索引问题:索引在查询中如何使用?看了很多资料都只说索引的建立。是否建立了就不用再理会?...

    # 有这样一个表 P mysql> create table P (id int primary key, name varchar(10) not null, sex varchar(1), ...

  8. mysql索引选择_MySQL 索引选择原则

    目的 MySQL查询优化器是基于代价(cost-based)的查询方式.因此,在查询过程中,最重要的一部分是根据查询的SQL语句,依据多种索引,计算查询需要的代价,从而选择最优的索引方式生成查询计划. ...

  9. mysql 索引 二_MySql索引(二)

    所有MySQL列类型可以被索引.根据存储引擎定义每个表的最大索引数和最大索引长度. 所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节.大多数存储引擎有更高的限制. 索引的存储类型目前只 ...

最新文章

  1. 集群资源分配_分析下 Node.js 关于集群的那些事
  2. “新基建”沙龙(一)精华回顾 | 5G与工业互联网的发展机遇与挑战
  3. 哨兵模式原理_Redis哨兵、复制、集群的设计原理,以及区别
  4. 图像纹理合成_EnhanceNet:通过自动纹理合成实现单图像超分辨率
  5. 2022,你的团队距离持续部署还有多远?
  6. 以30字符宽居中输出python字符串_Python3 字符串
  7. python字典保存为excel_python将字典列表导出为Excel文件的方法
  8. Linux 终端操纵之扼要疾速指南(2)
  9. 公众号搜题接口API
  10. 数据库——关系数据库规范化习题
  11. eclipse中各图标的含义
  12. 大学计算机基础 - 第七章练习题
  13. 英语影视台词---无敌破坏王2大脑互联网
  14. 收藏--真正爱你的男人
  15. 「数据运营」理解DataOps运营
  16. 什么是链路追踪?分布式系统如何实现链路追踪?
  17. 数据加密方式(3类)
  18. Win系统如何取消f1打开浏览器
  19. [附源码]Python计算机毕业设计个人人际关系管理软件Django(程序+LW)
  20. php 关键词生成,全自动无限生成关键词页面(黑帽SEO优化终极方法)

热门文章

  1. 周易Java_关于维度、计算机、周易的漫思
  2. html语言中行距如何设定,html怎么设置行间距离
  3. 1000个瓶子里面999瓶是水,多少次试验确定哪瓶是毒药
  4. python中括号的作用_python中中括号
  5. Leetcode 345 Reverse Vowels of a String 字符串处理
  6. 论文笔记:Multi-level Alignment Network for Domain Adaptive Cross-modal Retrieval
  7. NPN三极管和PNP三极管的工作原理
  8. 耳机在macOS系统电脑上怎么听不到任何声音怎么办?
  9. 如何用Phaser实现一个全家福拼图H5
  10. HDU - 3681 Prison Break(状态压缩 + 最短路)