锐安盾-网站安全加速服务

中国站

联系我们

400-002-9968

售前咨询

售后服务

注册 登录

博客 > MySQL知识:MySQL InnoDB索引的存储结构

MySQL知识:MySQL InnoDB索引的存储结构

  • 标签:
  • MySQL
  • InnoDB索引
  • MySQL索引

浏览量:1985次评论:0次

作者:锐成网络整理时间:2024-08-12 17:15:56

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表生成一个隐含字段作为主键。

聚簇索引结构如下图所示:

MySQL知识:MySQL InnoDB索引的存储结构

非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

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

二级索引结构如下图所示:

MySQL知识:MySQL InnoDB索引的存储结构

创建索引的建议

由于二级索引中保存了主键值,所以索引主键值越小越好,以免二级索引占用的空间过大,一般建议使用int的自增列作为主键。

这样可以保证数据行是按顺序写入的,对于根据主键做关联操作的性能也会更好。

因为主键是顺序的,所以每一条记录都保存在上一条记录的后面,当前的页写满的时候,下一条记录就写在新的页中。

这样在读取数据的时候,就可以按顺序读取,充分利用了局部性的优势,大大提高了读取效率。

自增主键新增数据示例:

MySQL知识:MySQL InnoDB索引的存储结构

建议避免使用UUID作为聚簇索引,它使得聚簇索引的插入变得完全随机,使得数据没有任何聚集特性。

因为UUID主键是随机生成的,新的主键不一定比上一个主键大,所以无法每次都把新的主键插入到最后面,需要为新的主键寻找合适的位置,通常在已有数据的中间位置。

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

UUID主键新增数据示例:

MySQL知识:MySQL InnoDB索引的存储结构

所以,聚簇索引最好用自增的列,并且要尽可能的小,这样可以避免二级索引过大。

重要声明:本文来自编程我也会,经授权转载,版权归原作者所有,不代表锐成观点,转载的目的在于传递更多知识和信息。

我的评论

还未登录?点击登录

微信扫码沟通
微信扫码沟通

微信扫码沟通

售前咨询
合作
售后
return head