一、 索引实现的数据结构
Mysql对于不同的存储引擎,索引的实现实现方式是不同的。主流的存储引擎:MyISAM和InnoDB,两种存储引擎都使用B+Tree(B-Tree的变种)作为索引结构,但是在实现方式上,却有很大的不同。下面是两种BTree数据结构:
B-Tree结构:
B-Tree索引数据结构
B-Tree无论是叶子结点还是非叶子结点,都含有key和一个指向数据的指针,只要找到某个节点后,就可以根据指针找到磁盘地址从而找到数据。
B+Tree结构:
B+Tree索引数据结构
B+Tree所有叶子结点才有指向数据的指针。非叶子结点就是纯索引数据和主键。每个叶子结点都有指向下一个叶子结点的链接。
小结:非叶子结点存放在内存中,也叫内结点,因此,在有限的内存中, B-Tree中每个数据的指针会带来额外的内存占用,减少了放入内存的非叶子结点数;B+Tree则尽可能多地将非叶子结点放入内存中。
二、Mysql中索引实现
由于B+Tree数据结构的优势,目前mysql基本都采用B+Tree方式实现索引,下面列出了两个最常用的存储引擎的索引实现:
1、MyISAM:如下图,叶子结点的data域存放的是数据的地址:
MyISAM引擎中的B+Tree索引结构
上图表中共三列数据,col1为主键,表示MyISAM表的主索引示意图,在MyISAM中,主索引和辅助索引(除主键以外的其它索引)在结构上没有任何区别,只是主索引的key是唯一的,辅助索引的key可以重复。
2、InnoDB:对比MyISAM,InnoDB的主键索引与辅助索引存储方式是不同的:
主键索引:主键索引的叶子结点存放的是key值和数据,叶子结点载入内存时,数据一起载入,找到叶子结点的key,就找到了数据。
Innodb主键索引结构
辅助索引:辅助索引的叶子结点存放的是key值和对应的记录的主键值,使用辅助索引查询,首先检索辅助索引获取主键,然后用主键在主索引中检索获取记录。
Innodb辅助索引结构
小结:MyISAM索引叶子节点存放的是数据的地址,主键索引与辅助索引除了值得唯一性在结构上完全一样。InnoDB索引叶子节点存放的内容因索引类型不同而不同,主键索引叶子节点存放的是数据本身,辅助索引叶子节点上存放的是主键值。
今天的分享就到这里,如果喜欢我的内容,欢迎转发~~
下期见!
举报/反馈

编程小丸子

34获赞 47粉丝
90后IT男,PHP工程师,专注技术
关注
0
0
收藏
分享