在mysql,聚集索引通常就是主键索引,非聚集索引通常就是普通索引,它们有什么区别?
测试表
先建一张表,有id、name和其他列。id建立主键索引,此时就是聚集索引。name建立普通索引,此时就是非聚集索引。
聚集索引 (id)
聚集的意思:在mysql中的索引的key及其数据行,在物理上是聚集存储在一起的。当找到某个索引的key值,也就找到了其行数据。如下图,找到了id 1,也就找到了第一行数据。
非聚集索引 (name)
非聚集的意思:name索引的key和行数据,在物理上没有聚集存储在一起,而是分开存储。如下图。查询name列,查找到a时,其值为主键id 3,而不是行数据。然后再根据3去查聚集索引,才能查到实际数据。这个过程,是mysql内部实现的。很显然,非聚集索引额外查询了一次,性能必然低于聚集索引。那为什么还要建立非聚集索引?
聚集索引只会有一个
- 索引必须是要按顺序存储的,这样才能通过二分查找法,来查找索引。就像我们翻书一样,后面的页数一定比前面的页数大,它是有序的,否则你没法查找特定的页数(索引)在哪。
- 因为有序,所以只可能是一种顺序。如果按id列的值顺序存储,那这个顺序肯定是不符合name列的值顺序的,除非id列和name列的值顺序是完全一样的,这是无法保证的。所以只会有一种顺序,只能保证建立一个聚集索引
- 如果在name列额外建立聚集索引,即复制一份数据作为索引的value。此时id和name两个聚集索引,每一行数据将存储两份,要同时维护更新,将会无比复杂。
- mysql默认会将主键索引作为聚集索引,如果没有主键呢?这里不讨论,不建议这样做。