温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MySQL InnoDB索引的存储结构和分类

发布时间:2021-09-16 07:37:28 来源:亿速云 阅读:238 作者:chen 栏目:大数据

本篇内容介绍了“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表生成一个隐含字段作为主键。


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


MySQL InnoDB索引的存储结构和分类


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


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


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

MySQL InnoDB索引的存储结构和分类


创建索引的建议


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


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


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


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


自增主键新增数据示例:

MySQL InnoDB索引的存储结构和分类


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


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


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


UUID主键新增数据示例:

MySQL InnoDB索引的存储结构和分类


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

“MySQL InnoDB索引的存储结构和分类”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI