【mysql】B+树、索引

B树/B+树

(b树、b+树与二叉查找树的不同在于它们每个根节点都可以有很多叶子节点,并且存放的数据不止一条,是2条以上,即一个数据块。相同的是它们的每个节点也是经过排序的(MySQL 是按照索引字段值对应字符集的排序规则对其进行升序排序的

B树:根叶节点都会存部分数据,叶子节点之间互相没有指针

B+树:根存储指针,叶子节点存储数据(mysiam是数据库记录所在的码,不是真正的行数据内容。页又叫块,数据存放单位依次为:表、区、段、页、行。每页默认16KB,可设为4、8KB等,有2到多行的数据。定位到页码后,就可以在对应的数据页通过二分查找(所有记录已经按照主键做好升序排序)快速定位主键对应记录的位置。innodb存的就是数据,数据过大会溢出,保证至少2行),每个根下有多个叶子,innodb使用的B+树叶子节点之间还互相有顺序访问指针,即双向循环链表,由于每个大小固定,B树存了data会导致其能存储的指针变少,要存储同样多的数据会增加树的高度,B+树叶子节点互相有指针,更适合做区间查找、遍历。B+树相邻的元素往往整块被读入内存,因而缓存命中率相对较高。

B+树无论是否查询到数据,都是从根到叶的查找,但是B树可能查到根。

B+树是一种平衡查找树,但并不是最优二叉树,虽然最优二叉树查找性能最高,但是维护成本太高,而B+树在增删改后保持平衡代价较低。B树、B+树不是二叉树,它们可以拥有很多叶子节点。

B+树高度一般在2-4之间,页太小、数据量特别大等会导致B+树变高。

我在阿里云藏经阁看到一本《mysql表和索引优化实战》,算了理论情况下一亿行数据用B+树只需要4层,不过它好像没考虑页大小之类的问题?网上算法普遍还是关注页大小的(参考:https://zhuanlan.zhihu.com/p/86137284),不过就算参考也是三四层足够了。

另外并不是B+树一定就优于B树,mongodb就选了B树,因为它查询单条数据的业务场景更多,根节点也能存数据的话,算起来平均随机IO比B+树少,不过它查一个范围之类就比较慢,一个一个查,没什么存储规律。

索引分类

按结构:B+树索引、hash索引、全文索引

B+树索引又分为:聚集索引、非聚集索引

按约束:主键索引、唯一索引、普通索引、联合索引、全文索引

B+树索引、hash索引、全文索引

B+树索引使用B+树实现,查

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值