Mysql数据库中的B+树索引可以分为聚集索引和辅助索引(非聚集索引)。本文将介绍一下两者。

聚集索引

聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引(这里不懂先放着,一会举例),每张表只能有一个聚集索引,聚集索引的叶子节点存储了整个行数据。

解释:什么叫索引项的排序方式和表中数据记录排序方式一致呢?

我们把一本字典看做是数据库的表,那么字典的拼音目录就是聚集索引,它按照A-Z排列。实际存储的字也是按A-Z排列的。这就是索引项的排序方式和表中数据记录排序方式一致。

对于Innodb,主键毫无疑问是一个聚集索引。但是当一个表没有主键,或者没有一个索引,Innodb会如何处理呢。请看如下规则:

如果一个主键被定义了,那么这个主键就是作为聚集索引。

如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引。

如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,该列的值会随着数据的插入自增。

辅助索引

辅助索引:辅助索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,还存储了一个指向改行数据的聚集索引建的书签。

辅助索引可以理解成字典按偏旁去查字。

image.png

我们直接看B+树的Leaf Level中的叶节点,只存放了辅助索引那列的数据,并不包含整个行的数据,但是他后面存放了一个“指针”,比如黄色的Rudd,后面存的是4:705:01,代表完整的行记录在第705页的第一条记录。

所以非聚集索引有二次查询的问题:

非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,因此如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。

如何解决非聚集索引二次查询的问题:

建立两列以上的索引,即可查询复合索引里的列的数据而不需要进行回表二次查询,如index(col1, col2),执行下面的语句:

select col1, col2 from t1 where col1 = '213';

因为复合索引的列包括了col1和col2,不需要查询别的列,所以不需要进行二次查询。

要注意使用复合索引需要满足最左侧索引的原则,也就是查询的时候如果where条件里面没有最左边的一到多列,索引就不会起作用。(看不懂的话后面讲)

通俗的讲讲最左索引原则吧:

假设创建了复合索引index(A,B,C),那么其实相当于创建了如下三个组合索引:

index(A,B,C)

index(A,B)

index(A)

这就是最左索引原则,就是从最左侧开始组合。

所以说如果查询的时候,where语句没有最左边的一列或多列,就不会使用建立的索引去查询。

mysql辅助索引非叶子节点_Mysql的聚集索引与辅助索引相关推荐

  1. mysql辅助索引非叶子节点

    mysql 会根据主键,如果没定义主键则使用第一个唯一索引(如果都没有,会自动隐式的创建一个不可见的自增列)创建一个b+tree索引树. b+tree的非叶子节点只会存储索引列和指向下级节点的指针,而 ...

  2. mysql 页和叶子页_Mysql —— 页与索引

    一.前言 之前了解过Mysql中索引的数据结构,但是看得非常浅显,仅仅知道索引底层实现的数据结构是 B+ tree,以及B+ tree 简单的增加节点和删除节点.但是对一些细节问题依然不太明白,在此借 ...

  3. mysql索引 聚集索引_MySql数据库索引-聚集索引和辅助索引

    InnoDB存储引擎索引: B+树索引:不能找到一个给定键值的具体行,能找到的只是被查找数据行所在的页.然后把页加载到内存,在查询所要的数据. 全文索引: 哈希索引:InnoDB会根据表的使用情况自动 ...

  4. MySQL聚集索引详解_MySQL innodb 聚集索引的概念与使用教程

    聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同.一个表只能有一个聚集索引,因为一个表的物理顺序只有一种情况,所以,对应的聚集索引只能有一个. 在MySQL中,InnoDB引擎表是( ...

  5. Mysql (InnoDB引擎)聚集索引和辅助索引

    聚集索引: InnoDB存储引擎表是索引组织表,即按照主键的顺序存储数据.  聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,树中的叶子节点存放着表中的行记录数据,因此, ...

  6. 二叉树叶子结点,非叶子节点以及深度的计算

    二叉树叶子结点的计算 //统计叶子结点的数目 int LeafNum(BiTree T) {if (!T) {return 0;} else if (!T->lchild && ...

  7. 详解Pytorch中的requires_grad、叶子节点与非叶子节点、with torch.no_grad()、model.eval()、model.train()、BatchNorm层

    requires_grad requires_grad意为是否需要计算梯度 使用backward()函数反向传播计算梯度时,并不是计算所有tensor的梯度,只有满足下面条件的tensor的梯度才会被 ...

  8. 完全二叉树最后一个非叶子节点

    一个完全二叉树节点为数为N: 编号为 1~N 则 节点编号满足 left =2*i   right =2*i+1; 左为偶数,右为奇数: 配合数组时 编号为 0~N-1;  节点编号满足 left = ...

  9. 堆排序(完全二叉树)最后一个非叶子节点的序号是n/2-1的原因

    堆排序是基于完全二叉树实现的,在将一个数组调整成一个堆的时候,关键之一的是确定最后一个非叶子节点的序号,这个序号为n/2-1,n为数组的长度.但是为什么呢? 可以分两种情形考虑: ①堆的最后一个非叶子 ...

最新文章

  1. 哪里可以学python编程-Python编程适合哪些人学?老男孩Python教程
  2. Hystrix 熔断降级
  3. python3 读取配置文件中的参数值替换yaml文件中的占位符(变量)
  4. 30分钟3300%性能提升—python+memcached网页优化小记
  5. portainer容器可视化管理部署简要笔记
  6. 项目经理沟通的四个好习惯
  7. java的制造商,国内某通信设备制造商JavaEE开发岗面试题
  8. centos linux7修改主机名,CentOS7操作系统下永久修改主机名
  9. androidStudio快捷键概览
  10. java编程思想第四版第十一章总结
  11. Android SVG矢量图形打造中国地图
  12. 科研画图——流程图软件draw.io
  13. 计算机程序设计艺术读书感悟
  14. ESP8266学习笔记:实现ESP8266的局域网内通信
  15. 电脑开机显示“被调用的对象已与其客户端断开连接”解决方法
  16. #路由配置以及华为路由协议优先级
  17. 图灵Java架构师学习路线图
  18. starGan-v2论文复现-代码完整
  19. ubt搭建rabbitMQ消息队列
  20. 国际漫游攻略之2016

热门文章

  1. android版开源绘图,Krita来到Android 适用于您的智能手机的最佳免费绘图应用程序...
  2. Oracle针对EMP表的练习题(很有用,值得收藏)
  3. java接口自动化监控_java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮...
  4. 【无标题】体验scratch海底世界
  5. 一大波无门槛优惠券来袭(仅限300张)
  6. Eclipse官网快速下载
  7. mac外接显示器wifi无法正常使用的问题
  8. 当西门子遇上施耐德:S7-12001500与M241的Ethernet通讯
  9. Redis学习之setex命令
  10. Battery Historian