mysql (1) 聚集索引和非聚集索引

聚集索引在MySQL中与数据行存储在一起,找到索引即可找到数据;而非聚集索引则索引与数据分开存储,需要二次查找。虽然非聚集索引查询效率稍低,但可以为非主键字段提供快速访问。每个表只有一个聚集索引,通常由主键创建。非聚集索引适用于不同查询场景,提高查询速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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默认会将主键索引作为聚集索引,如果没有主键呢?这里不讨论,不建议这样做。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值