双向链表可以说是众多中间件数据结构当中运用的相当多的了,mysql、redis都有涉及到
- 1.mysql的Innodb存储引擎的数据组织形式,索引的数据结构
- 2.redis
1.mysql的Innodb存储引擎的数据组织形式
innodb存储引擎存储数据的时候是以索引为结构来组织数据的,数据是存储在数据页中的,数据页是按照索引排序完成,每个页的大小可以如下通过命令查看
show global status like 'innodb_page_size'
一般默认16KB,每页的数据都按照索引的顺序从小到大以单链表的形式连接在一起,页和页之间则是以双向链表的形式互相连接在一起,如下图:
一般给页做一个目录,保存索引和页号的映射关系,根据二分法就能快速找到数据所在的页。目录页肯定很多,毕竟一个页的大小为16k,我们可以对数据建立多个目录页,在目录页的基础上再建目录页,如下图所示:
这其实就是一颗B+树,也是一个聚集索引,即数据和索引在一块。叶子节点保存所有的列值,非叶子节点冗余了部分叶子结点的数据,所有的索引数据都放在了叶子结点上,这是一种典型的以空间换时间的做法,类似于布隆过滤器,值得学习 正常B+树一个节点可以存放多个数据页或者目录页,这样可以让这个索引B+树更加健壮,节点存放的数据类型也跟索引的类型有关,如果是聚簇索引,我理解也是主键索引,非叶子节点存放主键和页号,叶子结点存放的是行记录,对于非聚簇索引,非叶子节点存放的是索引列+页号,叶子节点存放的就是索引和主键,这也就是聚簇索引和非聚簇索引的区别
当我们通过非聚簇索引获取到主键以后,再去聚簇索引的数据结构中,拿到叶子节点上的行记录,这个过程就是回表,这个原理可以用来解决深度分页
未完待续。。。。