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

在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默认会将主键索引作为聚集索引,如果没有主键呢?这里不讨论,不建议这样做。
  • 0
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论

打赏作者

free_java

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值