🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[danger] 一切数据皆文件。 [TOC] ## 一、B树和B+树的区别 ### 1、树的深度不同 B树的每个节点存储了key和data,key是一条数据记录的键值 ,是唯一的,data存储的是数据记录除key以外的数据。而B+树只在叶子节点存储data数据,这样非叶子节点就能存储更多的key。所以B+树相较于B树来说更加的矮胖,因为索引树很大不能一次IO读取进内存,树的深度越浅,查找数据时IO的次数就越少,效率就更快。 ![](https://img.kancloud.cn/99/8b/998bdefa620436107c57843fc45a13ca_932x303.png) ### 2、叶子节点有序 B+树的每个叶子节点的指针指向相邻的叶子节点,构成一个**有序链表**,可以按照关键码排序的次序遍历全部记录。由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树叶子节点指针为null,则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。 ![](https://img.kancloud.cn/36/6a/366abb1687eb210bb44a3fb00c481291_920x340.png) ## 二、B+树在不同存储引擎中的区别 ### Innodb - 在**Innodb**存储引擎下,数据存放在两个文件中,frm文件是存放表结构数据,.ibd存放的数据和索引。Innodb中用到的索引是**聚集索引**,即索引(B+树)和数据存放在一起。 ![](https://img.kancloud.cn/81/9f/819ff94655a6d11f5ec91435dfab98aa_805x347.png) ### MyISAM - **MyISAM**中则.frm是存放表结构数据,MYD是表数据,MYI是存放索引。其索引类型为**非聚集索引**,数据查找时先从索引文件中找到数据的物理地址;再根据物理地址直接取数。 ![](https://img.kancloud.cn/46/67/466777d1836a3711637ddb3bc54b922a_559x463.png) 聚集索引的优点: 1、非叶子节点不存储data,只存储索引(指针和键值) 2、叶子节点不存储指针 3、顺序访问指针,提高区间访问的性能。 参考资料:https://blog.csdn.net/weixin_43256529/article/details/111730659