以下文章节选自如下链接。根据文章内容做了内容解说和扩容。
https://baijiahao.baidu.com/s?id=1692469218111984631&wfr=spider&for=pc
B+树是B-树的变体,也是一颗多路搜索树。一棵m阶的B+树主要有这些特点:
InnoDB一棵B+树可以存放多少行数据?
在计算机中,磁盘存储数据最小单元是扇区,一个扇区的大小是512字节。文件系统中,最小单位是块,一个块大小就是4k;InnoDB存储引擎最小储存单元是页,一页大小就是16k。
因为B+树叶子存的是数据,内部节点存的是键值+指针。索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中,进而再去数据页中找到需要的数据。叶子节点存放所有的数据库行信息。
假设B+树的高度为2的话,即有一个根结点和若干个叶子结点。这棵B+树的存放总记录数为=根结点指针数*单个叶子节点记录行数。
如果一行记录的数据大小为1k,那么单个叶子节点可以存的记录数 =16k/1k =16.非叶子节点内存放多少指针呢?我们假设主键ID为bigint类型,长度为8字节,而指针大小在InnoDB源码中设置为6字节,所以就是8+6=14字节,16k/14B =16*1024B/14B = 1170
因此,一棵高度为2的B+树,能存放1170 16=18720条这样的数据记录。同理一棵高度为3的B+树,能存放1170 1170 *16 =21902400,也就是说,可以存放两千万左右的记录。B+树高度一般为1-3层,已经满足千万级别的数据存储。
注意:按照上述计算,如果是此表全量加载到内存中,需要的内存为:叶子结点数,也是 InnoDB的页数( 1170 1170) 16 (单页所能存放的行数)* 1KB(每行大小)/1024/1024=21GB。
这里的两千万评估值和每行的数据大小成反比,和页面大小成正比,和内存大小成正比。
还要注意下:
为什么索引结构默认使用B+树,而不是B-Tree,Hash哈希,二叉树,红黑树?
简单版回答如下:1. Hash哈希,只适合等值查询,不适合范围查询。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论