数据库中聚集索引和非聚集索引

聚集索引:类似字典的拼音目录。表中的数据按照聚集索引的规则来存储的。就像新华字典。整本字典是按照A-Z的顺序来排列。这也是一个表只能有一个聚集索引的原因。因为这个特点,具体索引应该建在那些经常需要order by,group by,按范围取值的列上。因为数据本身就是按照聚集索引的顺序存储的。不应该建在需要频繁修改的列上,因为聚集索引的每次改动都意味着表中数据的物理数据的一次重新排序。就想新华字典一样。聚集索引适合建立在大数据量但是小数目不同值的列上,就像新华字典有收录了一两万的汉字,但是其拼音只有A-Z一样。但是并不是不同值越少越好。如果一个列只有极少值,如性别只有男女,在大数据量下无论是聚集索引和非聚集索引都是不适合建立的。因为其不同值辣么少。就像要查性别为男的,那么平均有一半就符合条件。就算建立索引也用处不大。值得注意的是有些数据库如sql server在你创建主键时会默认主键即为聚集索引,如果没有指定主键数据库本身也会创建一个不可见的索引,因为表本身总要有个排序规则是吧。主键作为聚集索引与大数据量但是小数目不同值适合建立聚集索引的规则是相违背的。即使这样也需要这样做的原因刚才说过,表总是需要一个排序规则的。如果你有更加合适的列适合做聚集索引是可以修改聚集索引的(区别于数据库,比如MySQL就不支持指定聚集索引),但是聚集索引的修改一定一定一定要谨慎,因为聚集索引涉及要数据的物理存放数据。不合理的聚集索引会十分严重的拖累数据库的性能。【注意,虽然一般主键默认就是聚集索引,但是并不代表聚集索引的值具有唯一约束,主键不等于聚集索引。这个不要弄混,刚才说过聚集索引适合大数据量但是小数目不同值的列上,聚集索引值是允许重复的,就像新华字典一样,拼音A下面会有很多字--此段进行修正:这个和数据库有关,也和数据引擎有关,MySQL的InnoDB引擎要求聚簇索引必须是唯一非空的列,因为对于InnoDB来说,聚集索引就是表】。聚集索引流程示意图:

非聚集索引:非聚集索引和表里面数据的物流地址顺序无关。有些像新华字段的偏旁,如单人旁,他下面的两个挨着的字可能页数会有很大的差别。非聚集索引的查询方式和聚集索引的查询方式不一样。聚集索引找到符合条件的目标即获得该目标行的所有数据,因为聚集索引跟节点就是数据行或者指向数据行的指针(这取决于数据库以及采用何种存储引擎)。非聚集索引则不一样,如果你查询的字段是非聚集索引的一部分。那么因为索引本身包含的就有相应数据就可以直接返回,但是如果你查的数据包含非索引数据,比如你用了select *,那么通过非聚集索引找到目标之后,根节点会有一个目标数据聚集索引的key,会通过这个key再通过聚集索引找到完整的目标数据。也就是说使用非聚集索引且要查询的列不包含非聚集索引列本身,那么要经过二次查询。一次查询获得聚集索引的key,二次通过key与聚集索引确定目标数据。有点像新华字段偏旁查询,但是查到字没标页数只标了读音,如果你仅仅查这字怎么写或者读什么,那么直接通过偏旁这个部分的数据即可,但是如果要查更详细的,就要通过拼音去拼音目录里面找,确定页数再去指定页获得具体数据了。当然这只是打个比喻,因为字典里面偏旁查到的字也会表明页数的。非聚集索引适合建立在大数据量下且有大数目不同值,即列中大部分值都互不相同的情况。非聚集索引流程示意图:

适用场景:

一般我们建立的索引都是非聚集索引

聚集索引和非聚集索引仅仅是一种概念,不同的数据库甚至同种数据库不同的存储引擎实现都有些许不一样。在后续学习过程中,对MySQL-InnoDB引擎的聚集索引和非聚集索引的理解有了更详细的了解,关于在MySQL中二者更详细的信息,感兴趣的话可以移步:

参考:

    百度百科:聚集索引

    百度百科:非聚集索引

    聚集索引和非聚集索引(整理)

    聚集索引与非聚集索引的总结

    聚集索引和非聚集索引的区别有哪些

    深入浅出数据库索引原理

    深入理解DB2索引(Index)

    快速理解聚集索引和非聚集索引

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yue_hu

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值