前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL InnoDB索引的存储结构

MySQL InnoDB索引的存储结构

作者头像
zhanyd
发布2022-05-16 13:28:06
8870
发布2022-05-16 13:28:06
举报
文章被收录于专栏:编程我也会

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主键新增数据示例:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程我也会 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档