索引的节点是按区还是页分的?

1 分钟阅读 268 字 + 30 词
我们知道 InnoDB 存储引擎是用 B+ 树来组织数据的。 B+ 树中叶子节点层是通过双向链表连接起来的,如果是以页为单位来分配存储空间,那么链表中相邻的两个页之间的物理位置并不是连续的,可能离得非常远,那么磁盘査询时就会有大量的随机I/0,随机 I/0是非常慢的。 解决这个问题也很简单,就是让链表中相邻的页的物理位置也相邻,这样就可以使用顺序 I/0 了,那么在范围查询(扫描叶子节点)的时候性能就会很高。 那具体怎么解决呢? 在表中数据量大的时候,为某个索引分配空间的时候就不再按照页为单位分配了,而是按照区(extent)为单位分配。每个区的大小为 1MB,对于 16KB 的页来说,连续的 64 个页会被划为一个区,这样就使得链表中相邻的页的物理位置也相邻,就能使用顺序IO了

目录