BlessingCR’s Blog
BlessingCR’s Blog

聚簇索引和非聚簇索引

一张表只能有一个聚集索引,一般就是主键。

区别:

最核心区别: 数据是否全部在在B+树上的叶子节点上,聚簇的全在叶子,非聚簇的反之。

聚簇索引:

聚集索引即索引结构和数据一起存放的索引。主键索引属于聚集索引。

在 MySQL 中,InnoDB 引擎的表的 .ibd文件就包含了该表的索引和数据,对于 InnoDB 引擎表来说,该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。

聚集索引的优点

聚集索引的查询速度非常的快,因为整个 B+树本身就是一颗多叉平衡树,叶子节点也都是有序的,定位到索引的节点,就相当于定位到了数据。

聚集索引的缺点

  1. 依赖于有序的数据 :因为 B+树是多路平衡树,如果索引的数据不是有序的,那么就需要在插入时排序,如果数据是整型还好,否则类似于字符串或 UUID 这种又长又难比较的数据,插入或查找的速度肯定比较慢。
  1. 更新代价大 : 如果对索引列的数据被修改时,那么对应的索引也将会被修改,而且聚集索引的叶子节点还存放着数据,修改代价肯定是较大的,所以对于主键索引来说,主键一般都是不可被修改的。

非聚簇索引

非聚集索引即索引结构和数据分开存放的索引。

二级索引属于非聚集索引。

非聚集索引的叶子节点并不一定存放数据的指针,因为二级索引的叶子节点就存放的是主键,根据主键再回表查数据。

非聚集索引的优点

更新代价比聚集索引要小 。非聚集索引的更新代价就没有聚集索引那么大了,非聚集索引的叶子节点是不存放数据的

非聚集索引的缺点

  1. 跟聚集索引一样,非聚集索引也依赖于有序的数据
  1. 可能会二次查询(回表) :这应该是非聚集索引最大的缺点了。 当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询。
https://vipkshttps13.wiz.cn/editor/d43a29e0-2b90-11ed-a050-f704bb07f03a/4be71ae5-0743-4498-a948-085ca42525d6/resources/0_0M-_BrP7wwL0oykIiWI0_RLUgva7EPLaMnGnbRaDo.png?token=W.Dyc-Myak54KpnSdVGZ1EiHNEPIfj7696ZRfv0vK2DYJhC7F4BX8g07S-LASKldI

聚簇索引和非聚簇索引

一张表只能有一个聚集索引,一般就是主键。

区别:

最核心区别: 数据是否全部在在B+树上的叶子节点上,聚簇的全在叶子,非聚簇的反之。

聚簇索引:

聚集索引即索引结构和数据一起存放的索引。主键索引属于聚集索引。

在 MySQL 中,InnoDB 引擎的表的 .ibd文件就包含了该表的索引和数据,对于 InnoDB 引擎表来说,该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。

聚集索引的优点

聚集索引的查询速度非常的快,因为整个 B+树本身就是一颗多叉平衡树,叶子节点也都是有序的,定位到索引的节点,就相当于定位到了数据。

聚集索引的缺点

  1. 依赖于有序的数据 :因为 B+树是多路平衡树,如果索引的数据不是有序的,那么就需要在插入时排序,如果数据是整型还好,否则类似于字符串或 UUID 这种又长又难比较的数据,插入或查找的速度肯定比较慢。
  1. 更新代价大 : 如果对索引列的数据被修改时,那么对应的索引也将会被修改,而且聚集索引的叶子节点还存放着数据,修改代价肯定是较大的,所以对于主键索引来说,主键一般都是不可被修改的。

非聚簇索引

非聚集索引即索引结构和数据分开存放的索引。

二级索引属于非聚集索引。

非聚集索引的叶子节点并不一定存放数据的指针,因为二级索引的叶子节点就存放的是主键,根据主键再回表查数据。

非聚集索引的优点

更新代价比聚集索引要小 。非聚集索引的更新代价就没有聚集索引那么大了,非聚集索引的叶子节点是不存放数据的

非聚集索引的缺点

  1. 跟聚集索引一样,非聚集索引也依赖于有序的数据
  1. 可能会二次查询(回表) :这应该是非聚集索引最大的缺点了。 当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询。
https://vipkshttps13.wiz.cn/editor/d43a29e0-2b90-11ed-a050-f704bb07f03a/4be71ae5-0743-4498-a948-085ca42525d6/resources/0_0M-_BrP7wwL0oykIiWI0_RLUgva7EPLaMnGnbRaDo.png?token=W.Dyc-Myak54KpnSdVGZ1EiHNEPIfj7696ZRfv0vK2DYJhC7F4BX8g07S-LASKldI

发表回复

textsms
account_circle
email

  • Wow! Thank you! I constantly wanted to write on my blog something like that. Can I include a fragment of your post to my blog?

    1 月前 回复

BlessingCR’s Blog

聚簇索引和非聚簇索引
一张表只能有一个聚集索引,一般就是主键。 区别: 最核心区别: 数据是否全部在在B+树上的叶子节点上,聚簇的全在叶子,非聚簇的反之。 聚簇索引: 聚集索引即索引结构和数…
扫描二维码继续阅读
2023-02-21