InnoDB索引是在缓存中构建还是在磁盘中构建?
问题1:索引构建存储位置相关解答
InnoDB常规持久化表的聚簇索引和二级索引都不是仅在缓存中构建,所有索引结构默认都会先持久化到磁盘,再按需加载到缓存:
- 表初始化写入数据时,聚簇索引就会同步在磁盘的表空间文件中生成结构,后续新增二级索引的构建过程也会先在磁盘完成,最终持久化存储。
- Buffer Pool(缓存池)仅作为冷热数据的加速层,只会加载高频访问的索引页到内存,修改后的脏页会后续通过检查点机制刷回磁盘保证数据一致性。
- 仅内存临时表这类非持久化对象的索引,才会全程仅在内存中构建和存储,不会落盘。
参考MySQL官方手册说明:所有InnoDB持久化表的索引都以B+树结构存储在表空间文件中,Buffer Pool仅负责缓存高频访问的页数据。
问题2:聚簇索引叶子页相关解答
聚簇索引的叶子页会同时存在于磁盘和缓存两个位置,叶子页存储内容以实际行数据为主:
- 持久化的叶子页默认固定存储在磁盘的表空间文件中,访问时如果对应页不在缓存,会先从磁盘加载到Buffer Pool中再返回结果,长时间未访问的冷页会被缓存淘汰,仅保留磁盘副本。
- 聚簇索引的叶子页直接存储完整的行数据,这也是InnoDB表被称为索引组织表的核心原因,不需要额外指针跳转就能直接获取行的全量数据。只有当行中存在TEXT、BLOB等超大字段,超出页大小的部分才会存放到溢出页,此时叶子页中仅存储对应溢出页的指针。
参考MySQL官方对聚簇索引的定义:聚簇索引的叶子节点与行数据是相邻存储的,主键查询可以直接从叶子节点获取全量行数据,不需要二次寻址。
内容的提问来源于stack exchange,提问作者Tianxiong Yang
相关产品推荐
相关产品推荐

