B+Tree自从发明以来就成为了各种数据库引擎的首选,虽然近些年来LSM-Tree结构的数据库如雨后春笋般涌现,但B+Tree由于其优异性能以及各场景中均衡的性能表现,依然是各数据库的首选项。
但B+ Tree也并非毫无缺点,作为一种平衡多叉树结构,其优势是在数据量大时也能保持较低的树高,因而其无论查询或者是更新其代价均较低。但树的一大弊端是在更新时会触发结构调整,这种结构调整最长可能从叶子节点延伸至根节点,而这种树结构的调整会阻塞并发的读写操作,进而导致性能衰退。因此,如何优化B+ Tree在该场景下的并发访问性能也是学术界和工业界的一个重要的研究方向。
本文对于B-Tree和B+Tree进行了一个简单的介绍,并且重点介绍了在B+Tree的基础上提出的一种称之为B-link Tree的数据结构,通过一种比较巧妙的方法优化了B+ Tree结构调整时的锁粒度,提升并发度,保持高并发下的性能稳定。
一、B-Tree和B+Tree
B-Tree是为磁盘等外存储设备设计的一种平衡查找树。因此在讲B-Tree之前先了解下磁盘的相关知识。
系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。
InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小:
mysql> show variables like 'innodb_page_