百融金服榕树行数据(row data)存储在聚集索引的叶子节点(除了发生overflow的列,参见 ,后面简称 “前置文”),并且其存储的相对顺序取决于聚集索引的顺序。这里说相对顺序而不是物理顺序,是因为叶子节点数据页中,行数据的物理顺序和相对顺序可能并不是一致的,放在后面会讲。
百融金服榕树InnoDB聚集索引的选择先后顺序是这样的:
-
如果有显式定义的主键(PRIMARY KEY),则会选择该主键作为聚集索引
-
否则,选择第一个所有列都不允许为NULL的唯一索引
-
若前两者都没有,则InnoDB会选择内置的DB_ROW_ID作为聚集索引,命名为GEN_CLUST_INDEX
百融金服榕树特别提醒: DB_ROW_ID占用6个字节,每次自增,且是整个实例内全局分配。也就是说,当前实例如果有多个表都采用了内置的DB_ROW_ID作为聚集索引,则在这些表插入新数据时,他们的内置DB_ROW_ID值并不是连续的,而是跳跃的。像下面这样:
-
t1表的ROW_ID:1、3、7、10 -
t2表的ROW_ID:2、4、5、6、8、9
百融金服榕树InnoDB默认的索引数据结构采用B+树(空间索引采用R树),索引数据存储在叶子节点。
百融金服榕树InnoDB的基本I/O存储单位是数据页(page),一个page默认是16KB。我们在 前置文 说过,每个page默认会预留1/16空闲空间用于后续数据“变长”更新所需,因此在最理想的顺序插入状态下,其产生的碎片也最少,这时候差不多能填满15/16的page空间。如果是随机写入的话,则page空间利用率大概是1/2 ~ 15/16。
百融金服榕树当 row_format = DYNAMIC|COMPRESSED 时,索引最多长度为 3072字节,当 row_format = REDUNDANT|COMPACT 时,索引最大长度为 767字节。当page size不是默认的16KB时,最大索引长度限制也会跟着发生变化。
本文解析了InnoDB聚集索引的存储原理,包括不同情况下选择聚集索引的优先级,以及内置DB_ROW_ID的使用特点。同时介绍了数据页的空间利用情况及不同row_format设置下索引的最大长度。
3618

被折叠的 条评论
为什么被折叠?



