【数据库】聚簇索引/非聚簇索引

博客介绍了聚簇索引和非聚簇索引,聚簇索引叶子节点直接存储数据,非聚簇索引存储索引值和对应数据地址,一般聚簇索引查询效率更高。还解释了 MySQL 索引多为三层树结构的原因,基于节点大小和数据存储量,三层树通常可存储大量数据。

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

什么是聚簇索引/非聚簇索引

叶子节点:最下面那一层
聚簇索引:叶子节点上直接存储的数据
在这里插入图片描述
非聚簇索引:叶子节点上存储的是索引值和对应数据的地址
在这里插入图片描述
直接看起来聚簇索引查询效率应该比非聚簇索引效率高,毕竟少了一次地址查询的过程。但是加上辅助索引就不这么想了。
相关内容这篇写的不错

为什么我们见到的索引都是三层树结构

对于mysql他的每一个结点默认大小为16KB,假设索引值为int即4B同时指针(结点值之间的指针,就上图的空白部分)占6B,那么一个结点可以存储16KB/10B = 1648条数据
在这里插入图片描述
假设叶子节点每条数据1kb,一个叶子节点可存储16条
总数据数 = 1648x1648x16 = 4千来万
所以一般数据3层足够储存

### 数据库索引非聚簇索引的区别 #### 储方式差异 索引叶子节点包含了完整的数据记录,这意味着表的数据行按索引键顺序储。因此,在一张表上只能创建一个索引[^1]。 对于非聚簇索引而言,其叶子节点并不包含实际的数据记录;相反,这些节点保着指向真实数据位置的指针或是主键值(这取决于具体的数据库实现),从而允许在同一张表上建立多个非聚簇索引[^3]。 #### 性能影响 当查询条件能够利用到索引时,由于所需读取的数据已经按照该索引排列好了次序,所以通常可以获得较好的性能表现。然而,如果频繁更新具有索引列,则可能会引发页分裂等问题,进而降低效率[^2]。 相比之下,非聚簇索引可以加速那些不涉及大量范围扫描操作的查找过程,尤其是在多字段组合条件下更为明显。但是访问通过非聚簇索引来定位的数据项往往需要额外的一次I/O来获取真正的数据行,即所谓的“书签查找”。 #### 应用场景分析 - **索引适用情况** - 当在经常用于排序或分组的操作时; - 对于唯一性较高的字段作为检索依据的情况特别有利; - **非聚簇索引适合场合** - 如果应用程序主要执行的是基于某些特定属性的选择性很高但又不适合做为主键使用的过滤器; - 或者是在辅助其他类型的快速查找需求方面发挥作用,比如全文搜索引擎中的关键词映射关系维护等。 ```sql CREATE CLUSTERED INDEX idx_name ON table_name (column_list); CREATE NONCLUSTERED INDEX idx_name ON table_name (column_list); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值