双向链表的应用场景举例

1,025 阅读2分钟

双向链表可以说是众多中间件数据结构当中运用的相当多的了,mysql、redis都有涉及到

  • 1.mysql的Innodb存储引擎的数据组织形式,索引的数据结构
  • 2.redis
1.mysql的Innodb存储引擎的数据组织形式

innodb存储引擎存储数据的时候是以索引为结构来组织数据的,数据是存储在数据页中的,数据页是按照索引排序完成,每个页的大小可以如下通过命令查看

show global status like 'innodb_page_size'

一般默认16KB,每页的数据都按照索引的顺序从小到大以单链表的形式连接在一起,页和页之间则是以双向链表的形式互相连接在一起,如下图:

image.png

一般给页做一个目录,保存索引和页号的映射关系,根据二分法就能快速找到数据所在的页。目录页肯定很多,毕竟一个页的大小为16k,我们可以对数据建立多个目录页,在目录页的基础上再建目录页,如下图所示:

image.png

这其实就是一颗B+树,也是一个聚集索引,即数据和索引在一块。叶子节点保存所有的列值,非叶子节点冗余了部分叶子结点的数据,所有的索引数据都放在了叶子结点上,这是一种典型的以空间换时间的做法,类似于布隆过滤器,值得学习 正常B+树一个节点可以存放多个数据页或者目录页,这样可以让这个索引B+树更加健壮,节点存放的数据类型也跟索引的类型有关,如果是聚簇索引,我理解也是主键索引,非叶子节点存放主键和页号,叶子结点存放的是行记录,对于非聚簇索引,非叶子节点存放的是索引列+页号,叶子节点存放的就是索引和主键,这也就是聚簇索引和非聚簇索引的区别

当我们通过非聚簇索引获取到主键以后,再去聚簇索引的数据结构中,拿到叶子节点上的行记录,这个过程就是回表,这个原理可以用来解决深度分页

未完待续。。。。