其他
面试官:InnoDB 一棵 B+ 树可以存放多少行数据?
一个问题?
innodb
的所有数据文件(后缀为ibd的文件),他的大小始终都是16384(16k)的整数倍。+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)
B+ 树
number=3的页,该页存放键值和指向数据页的指针,这样的页由N个键值+指针组成。当然它也是排好序的。这样的数据组织形式,我们称为索引组织表。现在来看下,要查找一条数据,怎么查?
select * from user where id=5;
number=3的页(这点我们下文还会进一步证明),找到根页后通过二分查找法,定位到id=5的数据应该在指针P5指向的页中,那么进一步去page
number=5的页中查找,同样通过二分查询法即可找到id=5的记录:
1、InnoDB存储引擎的最小存储单元是页,页可以用于存放数据也可以用于存放键值+指针,在B+树中叶子节点存放数据,非叶子节点存放键值+指针。 2、索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中,进而在去数据页中查找到需要的数据;
一棵B+树可以存放多少行数据?
怎么得到InnoDB主键索引B+树的高度?
的代表主键索引的根页,而在根页偏移量为 64 的地方存放了该B+树的page level。如果page level为1,树高为2,page
level为2,则树高为3。即B+树的高度=page level+1;下面我们将从实际环境中尝试找到这个page level。
b.name, a.name, index_id, type, a.space, a.PAGE_NO
FROM
information_schema.INNODB_SYS_INDEXES a,
information_schema.INNODB_SYS_TABLES b
WHERE
a.table_id = b.table_id AND a.space <> 0;
number为4。关于二级索引与主键索引的区别请参考MySQL相关书籍,本文不在此介绍。
16384*3=49152(16384为页大小)
。level的值在整个文件中的偏移量为:
16384*3+64=49152+64=49216
,前2个字节中。总结:
小结
page level
,index number
等等,另外还有页的填充因子也导致一个页不可能全部用于保存数据。关于二级索引数据存取方式可以参考MySQL相关书籍,他的要点是结合主键索引进行回表查询。参考资料
《MySQL技术内幕:InnoDB存储引擎》 查看-innodb表中每个的索引高度
阅读更多
相信自己,没有做不到的,只有想不到的
在这里获得的不仅仅是技术!
喜欢就给个“在看”