聚簇索引和非聚簇索引

磁盘文件

Innodb存储引擎在磁盘上的文件是以.idb结尾的文件,它存放的是表索引+数据。这其实就是聚簇索引。

而Myisam存储引擎在磁盘上的文件是以.MYD结尾的表数据 和.MYI结尾的表索引,这其实就是非聚簇索引。所以区别之一是是否把索引和数据放在了一起。

叶子节点

聚簇索引的叶子节点存放的是真实的数据。非叶子节点是目录(一般是主键,如果没有主键,就用唯一键,没有唯一键,就会默认生成一个隐藏的键)。

非聚簇索引的叶子节点存放的是索引值(目录)以及存放真实数据的地址。拿到地址后,就去.MYD的文件中查找数据。

个数

一张表只能有一个聚簇索引,因为聚簇索引决定了数据行的物理存储顺序与索引的键值顺序相同,也就是说,索引的键值决定了数据在磁盘上的物理排列方式。因此,每张表只能有一个聚簇索引,是为了保证数据行只有一种物理存储顺序,避免了混乱和不一致性。

一张表可以有多个非聚簇索引,因为非聚簇索引与数据行的物理存储顺序无关。非聚簇索引只是单独地建立了索引结构,而数据行在磁盘上的存储方式并不受索引的影响。因此,多个非聚簇索引可以独立地建立在数据表上,互不影响。每个索引都可以针对不同的查询条件进行优化。这样可以提高数据库的灵活性和查询性能,满足不同的业务需求。

聚簇索引的特点

因为是有序的,所以适合应用在范围查询的场景中。

维护索引的成本较大。因为要保证有序。所以在插入新节点导致需要分页的时候,会影响效率。

聚簇索引的键值必须是唯一的,因为在物理结构上索引和数据是存在一起的,通过索引可以直接定位到那一行的数据。如果不唯一,那么就无法定位到具体的某一行数据。

非聚簇索引的特点 

非聚簇索引只存储索引键值和对应的行地址,不存储实际的数据行。因此,相比于聚簇索引,非聚簇索引占用的存储空间较小,可以节省存储资源。 

使用非聚簇索引可以减少磁盘I/O操作。由于索引存储的是索引键值和对应的行地址,而不是实际的数据行,因此可以减少从磁盘读取数据的次数,降低了I/O开销。

非聚簇索引的键值可以不唯一。因为非聚簇索引的叶子节点存的是指针。不是具体的数据行。即使键值存在相同,但是最终指向的数据也可能不同。因为一个表中存在相同数据的情况也非常多,但是实际上只是列的某一个属性相同但是实际上不是同一行的数据。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值