聚簇索引和非聚簇索引

本文详细介绍了InnoDB存储引擎的聚簇索引和二级索引的工作原理。聚簇索引默认以主键为索引,其叶子节点包含完整的行数据。而二级索引存储主键值,用于查询时通过主键查找数据。查询流程是先通过二级索引找到主键,再利用主键在聚簇索引中定位数据。

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

以InnoDB举例,默认创建的就是以主键作为索引的聚簇索引,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。非聚簇索引一般指的是二级索引,二级索引的data存的是主键。
查询流程是:先去二级索引找到主键,再用主键去聚簇索引找到数据。

### 索引非聚簇索引的区别 #### 定义 索引(Clustered Index)是指表中的物理数据存储顺序与索引键值的逻辑顺序一致[^3]。这意味着当创建了一个索引后,数据库会按照索引键重新排列实际的数据行位置。 而非聚簇索引(Non-clustered Index),其叶子节点并不包含真正的数据记录本身,而是包含了指向对应数据行的一个指针或者ROWID。这样即使通过非聚簇索引来访问数据,也需要额外的一次查找操作来获取完整的数据行信息。 #### 工作原理 对于 **索引** 来说,由于它决定了表中数据的实际存储方式,所以每张表只能有一个索引。这是因为数据行的位置一旦被固定下来就难以再改变其他排序规则。通常情况下,在InnoDB引擎下主键即默认作为索引存在;如果没有显式定义主键,则会选择一个唯一且空的字段自动构建为主键并形成索引。 相比之下,**非聚簇索引** 的实现更加灵活多样。它们不会影响原始表格里数据项之间的相对布局关系,只是单纯地建立了一种映射机制用于加速特定类型的检索过程。每当新增加一条新纪录时,只需简单更新相应的辅助索引结构而无需调整整个磁盘文件上的内容摆放格局。 #### 应用场景分析 ##### 索引的应用场合: - 当频繁执行基于某些列值范围内的扫描查询时,采用索引能够显著减少I/O次数从而提高效率[^1]。 - 对于那些经常需要按某种自然顺序读取大量连续行的操作而言常适合设置成形式。 ##### 非聚簇索引更适合下面这些情况之一者选用: - 如果应用程序主要依赖精确匹配而不是区间搜索的话那么利用覆盖索引技术就可以完全避免回表动作进而提升速度[^2]。 - 存在多维度过滤条件但又不可能全部组合起来构成复合型主关键字的情况下单独设立几个独立的小规模二级索引往往更为经济实用一些. ```sql -- 创建索引的例子 (假设使用的是支持此功能的关系型数据库系统) CREATE TABLE employees ( id INT NOT NULL, name VARCHAR(50), department_id INT, PRIMARY KEY(id) -- 这里的主键实际上就是一种特殊的索引 ); -- 添加非聚簇索引实例 ALTER TABLE employees ADD INDEX idx_department(department_id); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值