MySQL InnoDB索引的存储结构

InnoDB索引的数据结构

InnoDB索引采用了B-Tree的数据结构,数据存储在叶子节点上,每个叶子节点默认的大小是16KB。

当新记录插入到InnoDB聚簇索引中时,如果按顺序插入索引记录(升序或降序),当达到叶子节点最大的容量时,下一条记录就会写到新的的页中。叶子节点可使用的容量为总容量的15/16,InnoDB会留1/16的空间,以备将来插入和更新索引记录时使用, 如果以随机顺序插入记录,则页面的容量为1/2到15/16之间。

你可以设置 innodb_page_size 来调整页的大小,支持 64KB, 32KB, 16KB (默认), 8KB, 和4KB。

索引的分类

InnoDB的索引类型分为主键索引和非主键索引

主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。整张表的数据其实就是存储在聚簇索引中的,聚簇索引就是表

如果没有设置主键怎么办呢?MySQL会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键。

聚簇索引结构如下图所示:
在这里插入图片描述

非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。二级索引的叶子节点中存的是主键的值,不是原始的数据,所以二级索引找到主键的值之后,需要用该主键再去主键索引上查找一次,才能获取到最终的数据,这个过程叫做回表,这也是“二级”的含义。

二级索引结构如下图所示:
在这里插入图片描述

创建索引的建议

由于二级索引中保存了主键值,所以索引主键值越小越好,以免二级索引占用的空间过大,一般建议使用int的自增列作为主键。这样可以保证数据行是按顺序写入的,对于根据主键做关联操作的性能也会更好。

因为主键是顺序的,所以每一条记录都保存在上一条记录的后面,当前的页写满的时候,下一条记录就写在新的页中。这样在读取数据的时候,就可以按顺序读取,充分利用了局部性的优势,大大提高了读取效率。

自增主键新增数据示例:
在这里插入图片描述

建议避免使用UUID作为聚簇索引,它使得聚簇索引的插入变得完全随机,使得数据没有任何聚集特性。因为UUID主键是随机生成的,新的主键不一定比上一个主键大,所以无法每次都把新的主键插入到最后面,需要为新的主键寻找合适的位置,通常在已有数据的中间位置。

在页中间插入数据需要重新分配空间,以及移动旁边的数据,这样会导致频繁的页分裂操作同时会产生碎片。

UUID主键新增数据示例:
在这里插入图片描述
所以,聚簇索引最好用自增的列,并且要尽可能的小,这样可以避免二级索引过大。











在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值