磁盘文件
Innodb存储引擎在磁盘上的文件是以.idb结尾的文件,它存放的是表索引+数据。这其实就是聚簇索引。
而Myisam存储引擎在磁盘上的文件是以.MYD结尾的表数据 和.MYI结尾的表索引,这其实就是非聚簇索引。所以区别之一是是否把索引和数据放在了一起。
叶子节点
聚簇索引的叶子节点存放的是真实的数据。非叶子节点是目录(一般是主键,如果没有主键,就用唯一键,没有唯一键,就会默认生成一个隐藏的键)。
非聚簇索引的叶子节点存放的是索引值(目录)以及存放真实数据的地址。拿到地址后,就去.MYD的文件中查找数据。
个数
一张表只能有一个聚簇索引,因为聚簇索引决定了数据行的物理存储顺序与索引的键值顺序相同,也就是说,索引的键值决定了数据在磁盘上的物理排列方式。因此,每张表只能有一个聚簇索引,是为了保证数据行只有一种物理存储顺序,避免了混乱和不一致性。
一张表可以有多个非聚簇索引,因为非聚簇索引与数据行的物理存储顺序无关。非聚簇索引只是单独地建立了索引结构,而数据行在磁盘上的存储方式并不受索引的影响。因此,多个非聚簇索引可以独立地建立在数据表上,互不影响。每个索引都可以针对不同的查询条件进行优化。这样可以提高数据库的灵活性和查询性能,满足不同的业务需求。
聚簇索引的特点
因为是有序的,所以适合应用在范围查询的场景中。
维护索引的成本较大。因为要保证有序。所以在插入新节点导致需要分页的时候,会影响效率。
非聚簇索引的特点
非聚簇索引只存储索引键值和对应的行地址,不存储实际的数据行。因此,相比于聚簇索引,非聚簇索引占用的存储空间较小,可以节省存储资源。
使用非聚簇索引可以减少磁盘I/O操作。由于索引存储的是索引键值和对应的行地址,而不是实际的数据行,因此可以减少从磁盘读取数据的次数,降低了I/O开销。