聚簇索引和非聚簇索引的定义和区别
1.聚簇索引:
也叫聚集索引、主键索引,是将索引和数据放在一起,聚簇索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的用户记录都存放在主键索引的 B+Tree 的叶子节点里;找到索引也就找到了数据。数据行的物理顺序与列值(一般是主键的顺序)的逻辑顺序相同,一个表只能有一个聚簇索引。
2.非聚簇索引:
是指二级索引,也叫非聚集索引、辅助索引。通过非聚簇索引可以查到记录对应的主键值,再使用主键的值通过聚簇索引找到要查找的数据。索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表可以有多个非聚簇索引。
Innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值。
聚簇索引将数据行按照索引列的值顺序存储在同一个页或连续的页面上,适合范围查询和顺序访问操作。
非聚簇索引将索引和数据行分开存储,通过指针来定位数据行,适合查询和更新操作较多的场景。
3.区别:
聚簇索引和非聚簇索引主要有以下区别:
1.数据存储方式:
聚簇索引:表数据按照索引的顺序来存储。即索引的叶子节点包含了完整的数据行。
非聚簇索引:索引和数据是分开存储的,索引的叶子节点存储的是指向数据行的指针。
2.主键与索引关系:
聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。InnoDB 只聚集在同一个页面中的记录。包含相邻键值的页面可能相距甚远。如果你已经设置了主键为聚簇索引,必须先删除主键,然后添加我们想要的聚簇索引,最后恢复设置主键即可。
非聚簇索引可以在表的任何列上创建,不限于主键。
3.数据查找效率:
对于主键的查询,聚簇索引查找速度更快,因为直接可以获取到数据。
非聚簇索引需要先通过索引找到指针,再根据指针去查找数据,多了一次查找过程。
4.范围查询性能:
聚簇索引在范围查询时性能较好,因为数据在物理上是连续存储的。
非聚簇索引在范围查询时可能效率相对较低。
5.插入和删除操作影响:
聚簇索引在插入和删除数据时,可能会导致数据的移动,影响性能。
非聚簇索引相对来说对插入和删除操作的影响较小。