博客
关于我
Mysql数据库B-Tree索引
阅读量:789 次
发布时间:2023-02-12

本文共 1234 字,大约阅读时间需要 4 分钟。

为什么要使用索引

索引是数据库提高检索数据的常见手段。它是根据索引字段生成排好序的数据文件。

B+Tree索引是什么

在讲解B+Tree索引之前,我们需要了解二叉树、红黑树、B-Tree和Hash数据结构。

二叉树

规则:元素大的在右边,小的在左边。

缺点:树的高度随着数据量的上升而增高。如果索引字段为自增ID,生成的二叉树类似链表。我们知道链表的检索速度慢,所以二叉树性能低下。

红黑树

规则:元素大的在右边,小的在左边。

特点:相比二叉树,红黑树在树达到一定高度时会进行自我平衡,降低树的高度。所以相同的数据量,使用红黑树明显比二叉树性能会更好。

缺点:在百万级的数据中,树的高度依旧很高。检索数据能力欠缺。

Hash

对于Hash一般了解下,我们知道Hash对索引进行一次计算就能定位到数据,性能很优秀。但是不支持范围查询,所以一般不使用。

B-Tree

上面说过红黑树虽然可以自我平衡,但是数据量增加树的高度还会很高。为了解决这个问题,思考是否在分配节点时分配大一点,使一个节点可以存放多个索引元素,相比红黑树一个节点放一个索引元素,变成了每个节点都可以存放多个元素。那么我们可以这么理解,树的高度不高也能存放很多索引元素,这种数据结构称之为B-Tree。

B+Tree

B+Tree是B-Tree的变种,比较类似。但是我们可以发现,非叶子节点的元素都冗余了一份数据在叶子节点种,并且叶子节点用指针连接,提高了区间的访问性能。还有一点和B-Tree相比非叶子节点不存储data数据,这样可以存放更多的索引元素。


索引相关的知识点

聚集索引与非聚集索引

聚集索引(InnoDB):在InnoDB存储引擎下,B+Tree的叶子节点的data数据就存放完整的数据记录。

非聚集索引(MylSAM):在MylSAM存储引擎下,B+Tree的叶子节点data数据存放的是指向数据文件的地址。

为什么推荐使用主键自增ID

通过分析,索引元素是从左到右排好序的,并且节点的存放的索引元素个数是有上限的。如果不使用自增ID,且节点满了,当插入的元素刚好在满的节点上,试想会不会出现这样的一个现象,这个节点的元素会分裂并且移动到其他节点,从而带动每个节点移动,增加索引的维护成本。通过B+Tree生成器可以知道按照自增插入,会一直添加到最左边,这样在很大的程度上可以避免分裂,从而提高性能。

为什么叶子节点非主键索引Data存放的是主键ID

在B+Tree中,主键索引的叶子结点存放的是完整的数据记录,而非主键索引存放的是主键的ID。可以保证数据的一致性,存放主键ID相对于存放完整的数据记录,可以节省更多的磁盘空间。

最左前缀匹配原则

最左前缀匹配原则发生在联合索引中,它要求查询条件必须包含联合索引的第一个索引字段。因为生成B+Tree是按照联合索引字段先后顺序建立索引的。

覆盖索引

在SELECT查询语句中,查询的字段信息,都可以从索引文件中获取到,不要回表查询字段。

转载地址:http://addfk.baihongyu.com/

你可能感兴趣的文章
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
mysql中cast() 和convert()的用法讲解
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
查看>>
mysql中json_extract的使用方法
查看>>
mysql中null和空字符串的区别与问题!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
mysql中的 +号 和 CONCAT(str1,str2,...)
查看>>
MySQL中的count函数
查看>>
MySQL中的DB、DBMS、SQL
查看>>
MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
查看>>
MySQL中的GROUP_CONCAT()函数详解与实战应用
查看>>
MySQL中的IO问题分析与优化
查看>>