返回信息流小弟最近在学习Mysql的存储引擎InnoDB,遇到了不少问题,希望哪位大虾能够指点一二:
1、在进行二级索引查询的时候为什么要回表呢?
2、既然索引树是按照B+树进行组织的,那么最底层的数据的组织是不是按照B+树进行组织呢,如果不是那又是按照什么数据结构进行组织呢?
3、推荐使用自增整型列作为主键是为了避免使用业务逻辑列作为主键而导致的索引树叶子的分裂,这实际上是因为业务逻辑列的值到索引树位置的非线性映射引起的,那么有没有可能将业务逻辑列的值和索引树的位置进行线性映射呢,就是保证在业务逻辑列上排在前面的值的索引位置也一定在前面?
这是一条镜像帖。来源:北邮人论坛 / database / #11224同步于 2019/5/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖
【问题】InnoDB为什么要回表?
gxlihao
2019/5/13镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
1. 二级索引的叶节点里只保存了主键id,没有其他字段的数据,所以如果查询二级索引中没有的字段,则需要回表查
主键索引和二级索引都是b+树结构
2. 最底层的数据保存在磁盘里,通过物理地址定位
操作系统的文件和内存的数据通过逻辑地址定位
操作系统把逻辑地址传给磁盘,磁盘将逻辑地址转换为物理地址
b+树也广泛应用到文件系统中,底层细节我暂时也不太了解
那么数据库Mysql的存储引擎的InnoDB所操作的地址应该是操作系统的逻辑地址吧,而不是磁盘上的物理地址?
【 在 buptxiaomiao 的大作中提到: 】
: 2. 最底层的数据保存在磁盘里,通过物理地址定位
: 操作系统的文件和内存的数据通过逻辑地址定位
: 操作系统把逻辑地址传给磁盘,磁盘将逻辑地址转换为物理地址
: ...................
是逻辑地址
【 在 gxlihao 的大作中提到: 】
: 那么数据库Mysql的存储引擎的InnoDB所操作的地址应该是操作系统的逻辑地址吧,而不是磁盘上的物理地址?
:
1、那么实际上数据库系统从上到下有两层B+树结构(或者其它类似的数据结构),一层是索引的B+树,另一层是操作系统文件系统的B+树。
2、自增列整型主键是一个线性的映射方式,那么可不可以有另外一种线性的映射方式来讲业务逻辑列和索引树位置进行映射呢?从极端的角度来说,少维护一列可以有利于空间优化。
【 在 buptxiaomiao 的大作中提到: 】
: 是逻辑地址
: :
强行答一下,先回答第二个:
2.底层是按照B+树原理进行组织的,采用B+树的一个重要目的是减少磁盘查找的IO次数,所以物理文件的存储一定是按B+树格式的。网上可以查到innodb文件的格式。
1.楼上说的对,主键索引是聚集索引,就是叶节点上包含所有数据。但是二级索引叶节点上只有主键id。所以一个查询语句中如果只包含二级索引中的字段,那就不需要回表;如果包含了二级索引外的字段,需要回去查聚集索引。
3.使用自增列作为索引的好处是:影响到的页很大可能已经缓存在内存中了,对数据的修改可以现在内存中进行,后续再从内存刷到磁盘;如果使用随机uuid做主键,则B+树完全随机插在某页上,很大可能这页没缓存,要从磁盘加载,所以IO代价较大。
《高性能MySQL》一书中也提到了这样的弊端,并发情况下间隙锁造成最近的页热访问,可能产生并发瓶颈。
--部分总结自网络