#青训营笔记创作活动#
12月15日 打卡day2
主要是 MySQL 的 InnoDB 的 B+ 树储存结构(DYNAMIC 格式)。
基本上:
1. 一页(默认)是 16 KiB。
2. Everything is an index in InnoDB.
3. Non-leaf 页项目数与索引键有关,键大小越小项目数越多。
4. Leaf 页项目数和需要储存的列有关,主键的话需要存储所有的列,DYNAMIC 格式里有一些大的列会被放到页外。
5. 经验规律是 B+ 表不要超过三层,但对应的最大行数和上面所说的各页项目数有关,不可一概而论。

另外,很多时候 B+ 树的页都不是满的,所以对应的最大项目数会减少。这个时候主键使用严格自增的序列(自增或例如 snowflake id)则可以在插入时避免页分裂等问题,更充分利用空间。这也能解释为什么例如阿里规范里要求必须使用自增主键了。

使用更小的索引字段也可以增加单位空间的行数。例如 MySQL 里可以使用 prefix index。

关于缓存的话,MySQL 应该至少会把根节点和下一级的页缓存了,所以这个时候从三层到四层的磁盘开销可能就翻倍了。(但其实缓存看起来用的是 LRU,所以不同的使用场景最终结果也会有很大不同。)
展开
评论