几乎所有的 Innodb 的索引都使用 B 树
数据结构,除了空间索引 ( spatial indexes ) 是个例外。
空间索引使用的是 R 树
数据结构 ,这是一种索引多维数据的专用数据结构。
但不管使用的是任何索引结构,索引记录只存储在 B 树 或 R树 数据结构的叶子节点中。索引页的默认大小为 16KB
当有新的记录插入到 InnoDB 聚簇索引中时,InnoDB 会尝试将页面的 1/16 留空,以便将来插入和更新索引记录
- 如果按顺序 ( 升序或降序 ) 插入索引记录,则生成的索引页使用率大约为
15/16
- 如果以随机顺序插入记录,则页面使用率只会在
1/2
到15/16
之间
InnoDB 在创建或重建 B 树索引时执行批量加载,这种索引创建方法称为 「 排序索引构建 」。我们可以使用配置项 innodb_fill_factor
重新设置在排序索引构建期间填充的每个 B 树页面上的空间利用率,那么剩余的空间会保留以待将来的索引增长。这个设置项我们一般称之为 「 填充因子 」
但是,即使我们把 innodb_fill_factor
配置项的值设置为 100
,聚簇索引页仍然会保留出 1/16
的空间用于将来的索引增长。
另外,需要注意的是 「 空间索引不支持排序索引构建 」
如果 InnoDB 索引页的填充因子低于配置项 MERGE_THRESHOLD
的值 ( 如果未指定,默认情况下为 50%
) ,InnoDB 会尝试优化索引树以释放页面空间。
MERGE_THRESHOLD
同时适用于 B 树和 R 树数据结构
我们可以在初始化 MySQL 实例之前设置 innodb_page_size
配置选项来定义 MySQL 实例中所有 InnoDB 表空间的页面大小。InnoDB 表空间的大小一旦确定,也就是一旦 MySQL 实例初始化完成后,如果不重新初始化实例,则无法更改它。
目前支持的大小为 64KB
,32KB
,16KB
( 默认 ) ,8KB
和 4KB
,对应于选项值 64k
,32k
,16k
,8k
和 `4k 。
注意:使用特定 InnoDB 页面大小的 MySQL 实例不能使用来自不同页面大小的实例的数据文件或日志文件,也就是说两个不同数据页大小的 MySQL 实例的数据文件或日志文件是不能互通的。
常用面试题
-
InnoDB 表使用什么数据结构,它们的数据都保存在哪里
使用的是
B 树
数据结构,它们的索引数据都保存在叶子节点中。 -
InnoDB 的页大小一般是多少,把页大小提高为什么能提高 MySQL 的性能。
页大小决定了每次 IO 操作读取的数据大小,设置的越高当然每次读取的数据就越多,可以较少 IO 操作
结束语
其实吧,InnoDB 索引使用的应该是 B+ 树
,虽然 B+ 树
也是 B 树
的一个变体,但总感觉怪怪的。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。