B+树是一种多路搜索树,相较于B树有以下特性:
节点分为内部节点、叶子节点、根节点(根节点在某些情况下也属于内部节点、叶子节点)。
每个节点最多包含m-1个关键字、m个子节点。
内部节点不存储数据只作为索引使用,所有数据存储在叶子节点中。
节点中的关键字均为有序,取节点中某一关键字x,x左侧关键字与节点均小于x右侧关键字与节点均大于x。
所有叶子节点由指针有序相连。
B+树作为索引的优势
高效的查找性能: 通常情况下索引因大小问题无法一次性加载到内存中,必然涉及磁盘IO。B+树的内部节点不包含具体数据能够包含更多的关键字以减少树的高度,这就意味着可以减少磁盘IO。
适合范围查询: B+树的叶子节点按照键值大小顺序连接形成有序链表,这使得范围查询和范围扫描操作变得高效。B+树能够快速定位到范围查询的起始位置,并且在有序链表上进行连续扫描。
索引优化和B+树
出现在where关键词后面的字段适合设置为索引列,或者连接子句中指定的列也是可以设置为索引列;
选择列创建索引~对于唯一性的列,设置索引效果是最佳的;而对于具有多个重复值的列,其索引效果是最差的。 因此设置索引时,大家需要考虑该列中值的分布情况;
唯一索引在B+树叶子节点中只占一个值,可以通过内部节点快速找到。非唯一索引在找到之后还需要根据链表继续向后查找。在极端情况下可能读了一半叶子节点这样索引基本没有效果短索引原则即指定前缀长度,节省大量索引空间。 索引类型占空间越小每次IO能够读取更多的节点。反之则增加磁盘IO次数。
适度设置索引列:设置索引时要考虑设置合适的列,不要造成“过多的索引列”。索引不是越多越好,在插入数据以及删除数据时需要维护相应的索引树则会降低插入删除效率。
联合索引,遵循最左前缀匹配原则: 最左匹配原则并不是指查询条件的顺序,而是指查询条件中是否包含索引最左列字段;
使用联合索引时索引树内关键字是同时包含联合索引中所有的列并按照顺序排列,如果不包含左侧列的查询时是无法使用联合索引的。索引列不能参与计算,保持列“干净”: 如果索引列使用了函数或者其他计算就会导致索引失效,因为索引树中存储的都是原值如果应用函数就要全部都应用显然得不偿失。
范围条件存在多个索引时,查询可以命中索引: 范围条件有:<、<=、>、>=、between等,因为B+树的叶子节点都是有序存放的。如果是联合索引则最左匹配原则遇到范围查找后终止,返回查找后的列无法使用索引。因为范围查找出的记录是按照左侧列包含范围查找列排序的,无法保证右侧索引列有序故而右侧索引列失效。
利用覆盖索引进行查询,避免回表:innodb引擎是将所有数据存放在聚集索引中的,由主键构成的索引包含记录数据。其他索引时不包含记录数据的只包含聚集索引中的主键,如果查询使用了非聚集索引且改索引上无法满足查询则需要通过主键在聚集索引中再次检索称之为回标,如果当前索引中包含的查询的所有列则可直接返回。