mysql辅助索引非叶子节点_Mysql的聚集索引与辅助索引
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的聚集索引与辅助索引相关推荐
- mysql辅助索引非叶子节点
mysql 会根据主键,如果没定义主键则使用第一个唯一索引(如果都没有,会自动隐式的创建一个不可见的自增列)创建一个b+tree索引树. b+tree的非叶子节点只会存储索引列和指向下级节点的指针,而 ...
- mysql 页和叶子页_Mysql —— 页与索引
一.前言 之前了解过Mysql中索引的数据结构,但是看得非常浅显,仅仅知道索引底层实现的数据结构是 B+ tree,以及B+ tree 简单的增加节点和删除节点.但是对一些细节问题依然不太明白,在此借 ...
- mysql索引 聚集索引_MySql数据库索引-聚集索引和辅助索引
InnoDB存储引擎索引: B+树索引:不能找到一个给定键值的具体行,能找到的只是被查找数据行所在的页.然后把页加载到内存,在查询所要的数据. 全文索引: 哈希索引:InnoDB会根据表的使用情况自动 ...
- MySQL聚集索引详解_MySQL innodb 聚集索引的概念与使用教程
聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同.一个表只能有一个聚集索引,因为一个表的物理顺序只有一种情况,所以,对应的聚集索引只能有一个. 在MySQL中,InnoDB引擎表是( ...
- Mysql (InnoDB引擎)聚集索引和辅助索引
聚集索引: InnoDB存储引擎表是索引组织表,即按照主键的顺序存储数据. 聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,树中的叶子节点存放着表中的行记录数据,因此, ...
- 二叉树叶子结点,非叶子节点以及深度的计算
二叉树叶子结点的计算 //统计叶子结点的数目 int LeafNum(BiTree T) {if (!T) {return 0;} else if (!T->lchild && ...
- 详解Pytorch中的requires_grad、叶子节点与非叶子节点、with torch.no_grad()、model.eval()、model.train()、BatchNorm层
requires_grad requires_grad意为是否需要计算梯度 使用backward()函数反向传播计算梯度时,并不是计算所有tensor的梯度,只有满足下面条件的tensor的梯度才会被 ...
- 完全二叉树最后一个非叶子节点
一个完全二叉树节点为数为N: 编号为 1~N 则 节点编号满足 left =2*i right =2*i+1; 左为偶数,右为奇数: 配合数组时 编号为 0~N-1; 节点编号满足 left = ...
- 堆排序(完全二叉树)最后一个非叶子节点的序号是n/2-1的原因
堆排序是基于完全二叉树实现的,在将一个数组调整成一个堆的时候,关键之一的是确定最后一个非叶子节点的序号,这个序号为n/2-1,n为数组的长度.但是为什么呢? 可以分两种情形考虑: ①堆的最后一个非叶子 ...
最新文章
- 哪里可以学python编程-Python编程适合哪些人学?老男孩Python教程
- Hystrix 熔断降级
- python3 读取配置文件中的参数值替换yaml文件中的占位符(变量)
- 30分钟3300%性能提升—python+memcached网页优化小记
- portainer容器可视化管理部署简要笔记
- 项目经理沟通的四个好习惯
- java的制造商,国内某通信设备制造商JavaEE开发岗面试题
- centos linux7修改主机名,CentOS7操作系统下永久修改主机名
- androidStudio快捷键概览
- java编程思想第四版第十一章总结
- Android SVG矢量图形打造中国地图
- 科研画图——流程图软件draw.io
- 计算机程序设计艺术读书感悟
- ESP8266学习笔记:实现ESP8266的局域网内通信
- 电脑开机显示“被调用的对象已与其客户端断开连接”解决方法
- #路由配置以及华为路由协议优先级
- 图灵Java架构师学习路线图
- starGan-v2论文复现-代码完整
- ubt搭建rabbitMQ消息队列
- 国际漫游攻略之2016
热门文章
- android版开源绘图,Krita来到Android 适用于您的智能手机的最佳免费绘图应用程序...
- Oracle针对EMP表的练习题(很有用,值得收藏)
- java接口自动化监控_java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮...
- 【无标题】体验scratch海底世界
- 一大波无门槛优惠券来袭(仅限300张)
- Eclipse官网快速下载
- mac外接显示器wifi无法正常使用的问题
- 当西门子遇上施耐德:S7-12001500与M241的Ethernet通讯
- Redis学习之setex命令
- Battery Historian