一颗高度为3的B+树到底能存多少数据呢

发布于 2022-06-03 00:44

要回答这个问题,首先要知道B+树的结构是怎样的,存了什么数据,怎么存的,这些东西占多大等。先新建个表

CREATE TABLE IF NOT EXISTS `person`(   `id` INT UNSIGNED AUTO_INCREMENT,   `name` VARCHAR(64) NOT NULL,   PRIMARY KEY ( `id` ))ENGINE=InnoDB DEFAULT CHARSET=utf8;

‍InnoDB的页结构

  • 在InnoDB中,索引默认使用的数据结构为B+树,而B+树里的每个节点都是一个页,默认的页大小为16KB

  • 非叶子节点存的是索引值以及页的偏移量,而叶子节点上存放的则是完整的每行记录

大概认识了页里面存了什么,占多大空间,就可以估计能存放多少条数据了

B+树能存多少数据

  1. 非叶子结点能存多少数据

  • 页默认16KB

  • File Header、Page Header等一共占102个字节

  • Infimum + Supremum分别占13个字节

  • 记录头占5个字节

  • id占为int,占4个字节

  • 页目录的偏移量占4个字节

所以,非叶子节点能存多少条索引记录呢

非叶子节点能存放的索引记录=  (页大小 - File Header - Page Header - ...) / ( 主键 + 页偏移量 + 下一条记录的偏移量)= (16KB - 128B) / (5B + 4B + 4B) =  16256 / 13=  1250 条

2.叶子结点能存多少数据

  • 变长列表占1个字节

  • null标志位忽略

  • 记录头占5个字节

  • id占为int,占4个字节

  • name为VARCHAR,编码为UTF8,为了好算,所有行记录我都只用两个中文,那就是 2 * 3B = 6个字节

  • 事务ID列占6个字节

  • 回滚指针列占7个字节

   叶子节点能存放的数据记录=  (页大小 - File Header - Page Header - ...) / ( 主键 + 字段 + 下一条记录的偏移量)= (16KB - 128B) / (1B + 5B + 4B + 6B + 6B + 7B) =  16256 / 29=  560 条

3.高为3的B+树能存多少行记录

  • 根节点能放1250条索引记录

  • 第二层能放1250 * 1250 = 1,562,500条索引记录

  • 叶子节点 1250 * 1250 * 560 = 875,000,000条数据记录,八亿多条数据

也就是说,假如我的表里面只有id和name这两个字段的话,高为3的B+树能存八亿多条数据记录

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材