专栏名称: java一日一条
主要是讲解编程语言java,并且每天都推送一条关于java编程语言的信息
目录
相关文章推荐
Java编程精选  ·  Controller层代码这么写,简洁又优雅! ·  19 小时前  
Java编程精选  ·  字节员工自曝:在强调一遍OD ... ·  昨天  
Java编程精选  ·  雷军删文,热搜第一! ·  2 天前  
芋道源码  ·  如何实现一个合格的分布式锁 ·  昨天  
51好读  ›  专栏  ›  java一日一条

面试官:为什么 MySQL 索引要使用 B+树而不是其它树形结构?比如 B 树?

java一日一条  · 公众号  · Java  · 2019-10-30 19:57

正文

请到「今天看啥」查看全文


在MySQL中我们的InnoDB页的大小默认是16k,当然也可以通过参数设置:
数据表中的数据都是存储在页中的,所以一个页中能存储多少行数据呢?假设一行数据的大小是1k,那么一个页可以存放16行这样的数据。
如果数据库只按这样的方式存储,那么如何查找数据就成为一个问题
因为我们不知道要查找的数据存在哪个页中,也不可能把所有的页遍历一遍,那样太慢了。
所以人们想了一个办法,用B+树的方式组织这些数据。如图所示:
我们先将数据记录按主键进行排序,分别存放在不同的页中(为了便于理解我们这里一个页中只存放3条记录,实际情况可以存放很多)
除了存放数据的页以外,还有存放键值+指针的页,如图中page number=3的页,该页存放键值和指向数据页的指针,这样的页由N个键值+指针组成。
当然它也是排好序的。这样的数据组织形式,我们称为索引组织表。
现在来看下,要查找一条数据,怎么查?
如: select * from user where id=5;
这里id是主键,我们通过这棵B+树来查找,首先找到根页,你怎么知道user表的根页在哪呢?
其实每张表的根页位置在表空间文件中是固定的,即page number=3的页(这点我们下文还会进一步证明)
找到根页后通过二分查找法,定位到id=5的数据应该在指针P5指向的页中,那么进一步去page number=5的页中查找,同样通过二分查询法即可找到id=5的记录:
5    zhao2    27
现在我们清楚了InnoDB中主键索引B+树是如何组织数据、查询数据的,我们总结一下:






请到「今天看啥」查看全文