深入了解InnoDB索引结构

开课吧开课吧锤锤2021-06-07 11:04

    InnoDB默认的索引数据结构采用B+树(空间索引采用R树),索引数据存储在叶子节点。

Java

    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字节。当pagesize不是默认的16KB时,最大索引长度限制也会跟着发生变化。

    我们接下来分别验证关于InnoDB索引的基本结构特点。

    首先创建如下测试表:

[root@yejr.me] [innodb]> CREATE TABLE `t1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `c1` int(10) unsigned NOT NULL DEFAULT '0',
  `c2` varchar(100) NOT NULL,
  `c3` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `c1` (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

    用下面的方法写入10条测试数据:

set @uuid1=uuid(); set @uuid2=uuid();
insert into t1 select 0, round(rand()*1024),
                @uuid1, concat(@uuid1, @uuid2);

    看下t1表的整体结构:

# 用innodb_ruby工具查看
[root@yejr.me]# innodb_space -s ibdata1 -T innodb/t1 space-indexes
id    name       root   fseg        fseg_id   used    allocated   fill_factor
238   PRIMARY    3      internal    1         1       1           100.00%
238   PRIMARY    3      leaf        2         0       0           0.00%
239   c1         4      internal    3         1       1           100.00%
239   c1         4      leaf        4         0       0           0.0

# 用innblock工具查看
[root@yejr.me]# innblock innodb/t1.ibd scan 16
...
===INDEX_ID:238
level0 total block is (1)
block_no:     3,level:   0|*|
===INDEX_ID:239
level0 total block is (1)
block_no:     4,level:   0|*|

    可以看到

索引ID 索引类型 根节点page no 索引层高
238 主键索引(聚集索引) 3 1
239 辅助索引 4 1

JAVA

    以上就是小编为大家整理的“深入了解InnoDB索引结构”一文,更多Java教程相关信息尽在开课吧Java教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享