如图,一颗三层b+tree, 高度为3,则经过3次io可以查询到数据:
1.第一次io读取根页数据,假如数据填充满一整页,并且为聚簇索引,非叶子节点key值是主键值为bigint类型,占用8个字节,指针占用6个字节,非叶子节点一个元素大小是8+6=14字节,innodb最小存储单位是页,一页大小16kb,1kb=1024b,每次查询最多的数据元素个数是16*1024b/8b 约等于1170。
2.在第一次io读取到内存,匹配到第二次io要读取的地址,第二次io也是读取非叶子节点,同理读取最多元素个数也是1170。
3.在第二次io后获取到叶子节点地址,叶子节点存放的是一条整条数据记录,大小按照1kb估算,16kb/1kb = 16.
以前我疑惑的点是根节点为什么就一页呢,如果数据很多两页三页不行么,思索后答案是根节点只能有一页,或者说叫根页,如果数据很多构建树形结构时候应该增加更多的非叶子节点或者增加新的高度,而不是说搞两个根页,因为MySQL 用b+tree规则就是树高度几层就io几次课查到数据,假如有两个根节点不符合逻辑,总要有树根啊。
MySQL3层b+tree可以存多少数据,在本文预设的背景条件下,结论是1170*1179*16=21902400,两千多万条数据了。