本文共 1234 字,大约阅读时间需要 4 分钟。
索引是数据库提高检索数据的常见手段。它是根据索引字段生成排好序的数据文件。
在讲解B+Tree索引之前,我们需要了解二叉树、红黑树、B-Tree和Hash数据结构。
规则:元素大的在右边,小的在左边。
缺点:树的高度随着数据量的上升而增高。如果索引字段为自增ID,生成的二叉树类似链表。我们知道链表的检索速度慢,所以二叉树性能低下。
规则:元素大的在右边,小的在左边。
特点:相比二叉树,红黑树在树达到一定高度时会进行自我平衡,降低树的高度。所以相同的数据量,使用红黑树明显比二叉树性能会更好。
缺点:在百万级的数据中,树的高度依旧很高。检索数据能力欠缺。
对于Hash一般了解下,我们知道Hash对索引进行一次计算就能定位到数据,性能很优秀。但是不支持范围查询,所以一般不使用。
上面说过红黑树虽然可以自我平衡,但是数据量增加树的高度还会很高。为了解决这个问题,思考是否在分配节点时分配大一点,使一个节点可以存放多个索引元素,相比红黑树一个节点放一个索引元素,变成了每个节点都可以存放多个元素。那么我们可以这么理解,树的高度不高也能存放很多索引元素,这种数据结构称之为B-Tree。
B+Tree是B-Tree的变种,比较类似。但是我们可以发现,非叶子节点的元素都冗余了一份数据在叶子节点种,并且叶子节点用指针连接,提高了区间的访问性能。还有一点和B-Tree相比非叶子节点不存储data数据,这样可以存放更多的索引元素。
聚集索引(InnoDB):在InnoDB存储引擎下,B+Tree的叶子节点的data数据就存放完整的数据记录。
非聚集索引(MylSAM):在MylSAM存储引擎下,B+Tree的叶子节点data数据存放的是指向数据文件的地址。
通过分析,索引元素是从左到右排好序的,并且节点的存放的索引元素个数是有上限的。如果不使用自增ID,且节点满了,当插入的元素刚好在满的节点上,试想会不会出现这样的一个现象,这个节点的元素会分裂并且移动到其他节点,从而带动每个节点移动,增加索引的维护成本。通过B+Tree生成器可以知道按照自增插入,会一直添加到最左边,这样在很大的程度上可以避免分裂,从而提高性能。
在B+Tree中,主键索引的叶子结点存放的是完整的数据记录,而非主键索引存放的是主键的ID。可以保证数据的一致性,存放主键ID相对于存放完整的数据记录,可以节省更多的磁盘空间。
最左前缀匹配原则发生在联合索引中,它要求查询条件必须包含联合索引的第一个索引字段。因为生成B+Tree是按照联合索引字段先后顺序建立索引的。
在SELECT查询语句中,查询的字段信息,都可以从索引文件中获取到,不要回表查询字段。
转载地址:http://addfk.baihongyu.com/