1.每一个父节点的元素都出现在子元素中,是子节点的最大(小)元素
2.由于父节点的元素都需要出现在子节点中,因此所有叶子节点包含了全量元素信息。并且每个叶子节点都带有指向下一个节点的指针,形成了一个有序链表。
3.只有叶子节点带有数据,其余节点仅仅是索引,没有任何数据相关
在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针
B+ 树能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数
B+树的优势
1.一层存储更多的元素,使得查询的IO次数更少。
2.所有查询都要查找到叶子节点,查询性能稳定。
3.所有叶子节点形成有序链表,便于范围查询。
查找元素3,自顶向下
查询IO次数少,每次查询都必须查询到叶子节点,因为只有叶子节点存了数据。查找稳定。
查找范围3到11的元素,自顶向下,查找到范围的下限(3)
最左前缀原则是发生在复合索引上的,只有复合索引才会有所谓的左和右之分。
当b+树的数据项是复合的数据结构,比如(name,age)的时候。
b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age,最后得到检索的数据。
当(20)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。
比如当(张三)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,即索引的最左匹配特性。
当你的逻辑需求是查到所有名字是“张三”的人时,可以快速定位到 ID4,然后向后遍历得到所有需要的结果。
如果你要查的是所有名字第一个字是“张”的人,你的 SQL 语句的条件是"where name like ‘张 %’"。这时,你也能够用上这个索引,查找到第一个符合条件的记录是 ID3,然后向后遍历,直到不满足条件为止。