聚簇索引和覆盖索引

博客介绍了聚簇索引和覆盖索引。聚簇索引是InnoDB的数据存储方式,在同一结构保存B - tree和数据行,通过主键聚集数据。二级索引叶子页保留相关列值,查询非二级索引列值需二次查找。覆盖索引指索引包含查询字段值,二级主键覆盖查询可避免二次查主键。

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

聚簇索引:不是一种单独的索引类型,而是一种数据存储方式。InnoDB的聚簇索引实际是在同一结构中保存了B-tree和数据行。叶子页包含了行的全部数据,而节点页只包含了索引列。InnoDB通过主键聚集数据,如果没有定义主键,InnoDB将选择一个没有空值的列创建聚簇索引。(InnoDB引擎上,数据表都会有一个聚簇索引?)二级索引的B-Tree的叶子页上保留了二级索引的列值以及聚簇索引的列值。如果查询二级索引列值之外的值,需要对根据聚簇索引查询到其它列值。(二级索引访问需要两次索引查找)。

覆盖索引:索引包含所有要查询的字段的值,则称为覆盖索引。由于InnoDB中的二级索引在叶子节点中保存了行的主键值,如果二级主键能够覆盖查询,则可避免对主键的二次查询。

PS:发现一个很好的写SQL索引的博客。
英文版
中文版

### 关于索引与非索引的区别及其应用场景 #### 区别 索引决定了数据在磁盘上的物理存储顺序,意味着记录按照索引字段的值进行排序并连续存储。因此,在InnoDB引擎中,每张表仅能拥有一个索引,通常为主键或唯一键[^3]。 相比之下,非索引并不影响实际的数据行位置,而是创建了一个独立于数据文件之外的结构用于快速定位特定记录的位置。这种设计允许在同一表格内定义多个非索引以满足不同查询模式的需求[^4]。 对于查询操作而言: - **索引**:当访问条件匹配索引时,能够直接读取到完整的行数据而无需额外查找,这使得基于此类型的检索效率非常高。 - **非索引**:如果查询涉及未被该类索引覆盖的列,则需先通过索引来找到对应的ROWID或其他标识符再回到原表去提取剩余部分的信息——即发生所谓的“回表”。不过,借助覆盖索引技术可以在一定程度上减少甚至消除这种情况的发生[^5]。 #### 应用场景 选择合适的索引形式取决于具体的业务逻辑以及预期的工作负载特性: - 对于那些经常执行范围扫描或者按主键/唯一键频繁存取少量记录的应用程序来说,采用索引会更加高效; - 如果存在多种复杂的查询路径,并且希望保持较高的写入吞吐量而不受制于单个有序排列的影响,那么构建若干个针对性强的非索引可能是更好的策略。 此外,考虑到维护成本技术复杂度等因素,在规划阶段就需要权衡利弊做出合理决策[^2]。 ```sql -- 创建带有索引的表 (假设使用的是 InnoDB 存储引擎) CREATE TABLE clustered_example ( id INT NOT NULL, name VARCHAR(100), PRIMARY KEY(id) -- 这里隐含地指定了 'id' 列作为索引 ); -- 添加一个新的非索引给已有的表 ALTER TABLE non_clustered_example ADD INDEX idx_name(name); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值