![](https://i-blog.csdnimg.cn/blog_migrate/0dca3bb5ef325f7f52a9abc46ef06e32.png)
上图是B +树聚簇索引的结构图:
- B+树是一个棵二叉查找平衡树
- 图中每一个黄色块是一个数据页,磁盘和内存的交互是以数据页为最小单位
- 整颗树只有两层,叶子节点层中数据页通过双向链表连接且保持有序;非叶子节点页中数据以索引序号和指针交替排序
- 叶子节点中不仅包含索引序号还包含数据本身
创建如下表user
- id字段用bigint 占用8个字节
- name字段用VARCHAR(32) ,假设每个name都填满且都是英文字母,共占用32个字节
UTF-8:UTF-8一个(字符)占用(3)个字节,英文占用(1)个字节
其它条件
- 操作系统是32位的系统,也就是说一个指针的地址是4字节
- 一个数据页的大小是16KB
- 数据页的空间占满,其实这个是可以通过参数调整的,这里假设占满
问题:如果在user表中存1000万数据,整颗树的空间占用是多少?
- 非叶子节点页,一页16KB,一个元素占用8+4=12字节,一页有 16*1024/12 约等于 1360个元素
- 如果非叶子节点有2层能达到 1360 *1360=184,9600个元素,如果非叶子节点3层超过1000万个元素了,因此非叶子节点只需2层
- 叶子节点1000万个元素,如果每页占满有 (1024*16-4-4)/(8+32)=409个元素,1000w/409 = 24450 页
- 第一层1个节点 1页 16KB
- 第二层1360节点 1360*16KB
- 第三层 24450节点 24450*16KB
- 总共约占用空间 425M
注意:实际空间计算远远不只这些,比如一个数据页可能是占不满的,因为有空洞;还有就是其它功能占用的空间没有算进去;这里只是为了通过这个例子理解B+ 树的特点