Mysql索引数据结构–B+Tree
B+ Tree是在B Tree 的基础上做的优化,变化如下:
1、B+ Tree每个节点可以包含更多的节点,这个做的原因有两个,第一个原因是为了降低数的高度,第二个是为了将数据范围化为多个区间,区间越多,索引越快
2、非叶子节点储存Key,叶子节点存储key和数据
3、叶子节点两两指针相互连接(符合磁盘的预读特性),顺序查询性能更高
MyISAM
MyISAM是MySQL默认的存储引擎。MyISAM不⽀持事务、也不⽀持外键,其优势是访问的速度快,对事务完整性没有要求或者以 SELECT、INSERT 为主的应⽤基 本上都可以使⽤这个引擎来创建表。
我们可以进入mysql文件中的data目录,选择一个数据库,查看存储在磁盘上的结构:
其中 .frm文件存储的是表结构
.MYI文件存储的是表的索引
.MYD文件存储的是数据文件
MyISAM索引文件和数据文件是分离的(非聚集)
可以看下图理解一下:
其中 Primary Key通过非叶子节点的区间,快速定位到叶子节点,取出value ,这个value就是.MYI中的一条索引数据,再通过这个索引指向的是.MYD的数据,通过一次磁盘IO 定位到那条数据,就去取出那条数据。
InnoDB
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能⼒的事务安全。但是对⽐MyISAM的存储引擎,InnoDB写的处理效率差⼀些,并且会占⽤更多的磁盘空间以保 留数据和索引
我们也可以去查看一下该表是如何存储在磁盘上的
.frm文件存储的是表结构
.bid文件存储的是索引和数据文件,相互对应的
InnoDB索引文件和数据文件是共同存储在.bid文件里面的(聚集)
可以看下图理解一下:
其中 Primary Key通过非叶子节点的区间,快速定位到叶子节点,其中叶子节点上存储的是索引+数据。就不需要在想MyISAM那样再进行一次磁盘IO了,直接取出即可。
为什么InnoDB必须要有主键推荐使用整型的自增列呢?
https://blog.csdn.net/a1_HelloWord/article/details/104341349