索引为什么选择B+树

1. B树 和 B+树

我们都知道Mysql innodb引擎,使用B+树实现索引,为什么呢? 我们先看B 树 和 B+树的结构。
如图:
B树结构
这是B树的常见结构。

B+树结构
这是B+树常见结构,由图可见,叶子节点有所有的节点数据,数据之间排好序,叶子节点之间有指针相连。
顺便给大家推荐一个数据结构算法生成图的教育网站: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
这里可以生成任何你喜欢的数据结构及演示生成过程。

2.局部性原理

CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。这是教科书中的常见定义。
在软件开发中,程序的执行同样会有局部性规律,即在一段时间内如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。mysql引擎也不例外,在查询数据时相邻的数据会同时读入内存也是这个原因。
操作系统中我们知道,读取数据是按页进行读取,一页的大小大概是4kb,这也是操作系统基本的读取单元。
使用B+树结构,叶子节点指针相连,其实索引的B+树叶子层不仅仅是单链的,还有指向前驱的叶子节点的指针。由特性知,B+树更易于区域性查询,操作系统读取一页(其实mysql innodb引擎本身也有页的概念,叫做innodb_page_size 64kb)的数据,也会将临近的数据读取进入内存,在大量的执行查询下,根据局部性原理,这种索引结构,磁盘io最低。

3.什么类型的字段适合做主键

为了提高查询效率使用B+树,其实比B树更占用空间,是采取的空间换时间的方式,所以索引字段越小越节约空间,对于读取、扫描都更快,所以建议使用int这种类型而不是varchar去建立主键索引,即使表中没有明确的索引,mysql 也会默认提供rowid建立主键索引,用户无感知。
其次,插入数据时,根据B+树特性,会在叶子节点做排序,便于读取效率,所以原则肯定是字段占空间越小越好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值