MySQLInnoDB索引的存储结构和分类

本篇内容介绍了“MySQL InnoDB索引的存储结构和分类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业服务器托管报价,主机托管价格性价比高,为金融证券行业成都多线服务器托管,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。

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索引的存储结构和分类”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


文章名称:MySQLInnoDB索引的存储结构和分类
文章来源:http://hbruida.cn/article/gdscsi.html