小伙伴们大家好!今天是大年三十,给大家拜个早年!在此小弟祝各位大哥们与家人团团圆圆,和和睦睦,新的一年身体健康,工作顺利!
一、B+树索引概述
- B+树索引的本质就是B+树在数据库中的实现。但是B+索引在数据库中有一个特点就是高扇出性,因此在数据库中,B+树的高度一般都在2~4层,也就是说查找某一键值的行记录最多只需要2~4次IO。因为当前一般的机械磁盘每秒至少可以做100次IO,2~4次IO意味着查询时间只需0.02~0.04秒
B+树的大致工作原理
- 先抛开各种实现细节,来说一说B+树索引的大致工作原理
- 工作原理如下:
- 假设现在是主键索引表,一个表中有0、1、2、3、4、5、6、7、8八个主键
- 那么在B+树中,其叶子节点存储的是这些主键
- 当我们select * from table where id >1 and id <7的时候,那么会先从B+树的根节点开始向下查找,查找到1这个节点之后,由于底层节点之间是链表形式组织的,因此主键向右进行查找,从而查找到2、3、4、5、6这几个节点
- insert、update、delete这些都是相同的原理
InnoDB和MyIASM的B+树之间有什么差别
- InnoDB和MyIASM都支持B+树索引,那么它们之间的区别是什么呢?
- InnoDB:其叶子节点存储不仅存储着主键的值,并且还存储着该主键对应的行数据。因此,其每个叶子节点=主键+整行数据值
- MyIASM:其叶子节点也是存储着主键的值,但是其不存储该主键对应的行数据,其存储的是指向该行数据对应的地址。当我们查找到该主键值,再通过该指针查找到对应地址上的值
面试题:MyIASM与InnoDB通过B+数索引操作数据,哪一个更快?
- 规则为:
- 当操作的数据量不多时,可能两者没什么差别
- 当操作的数据量较大时,那么InnoDB比MyIASM快
- 解释如下:
- InnoDB从磁盘读取数据在内存中构造一棵B+树,由于其B+树叶子节点存储的都是数据的值,因此其数据直接存储在内存中
- MyIASM从磁盘读取数据在内存中构造一棵B+树,由于其B+树叶子节点只存储数据对应的指针,不存储值,因此其不会将数据读取都内存中
- 所以当数据量不多时,两者没什么区别:因为数据量小,InnoDB直接从内存中取数据,MyIASM通过指针去磁盘中查找数据,效率差别不大
- 当操作的数据量较大时,InnoDB直接从内存中取数据,那么速度较快,但是MyIASM需要不断的通过指针去磁盘中取数据,从而导致速度较慢