索引为什么选择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+树特性,会在叶子节点做排序,便于读取效率,所以原则肯定是字段占空间越小越好。

猜你喜欢

转载自blog.csdn.net/baoxue2008/article/details/106607464