聚簇索引与非聚簇索引

devtools/2025/2/16 4:59:18/

目录

一、聚簇索引(Clustered Index)

二、非聚簇索引(Non-Clustered Index)

三、示例说明


一、聚簇索引Clustered Index

定义:

聚簇索引是一种将数据存储和索引合为一体的索引方式。

  • 表中的数据行按照索引的顺序存储。

  • 索引的叶子节点直接存储完整的表数据。

特点:

  • 数据与索引的紧密结合:表的数据行与聚簇索引的叶子节点绑定。

  • 每张表只能有一个聚簇索引:因为数据的存储顺序只能按照一个索引排列。

  • 索引的主键决定数据存储顺序:若表中定义了主键,则主键默认作为聚簇索引;否则,数据库会选择一个唯一键或者生成一个隐式键作为聚簇索引。

  • 其他索引仅存储索引字段和主键,查询其他字段需要回表查询。

存储方式:

  • 索引结构:基于 B+ 树。

  • 叶子节点:直接存储完整的表数据。

  • 叶子节点:存储键值和指向子节点的指针。

优点:

  • 查询性能高:按主键范围查询效率极高,因为数据是按主键顺序存储的。

  • 数据访问更快:不需要通过额外的指针从索引找到数据。

  • 减少 I/O 操作:索引和数据存储在一起。 

缺点:

  • 插入、更新性能受影响:如果插入的数据不符合当前排序规则,可能会引起数据页的分裂或移动。

  • 索引占用存储空间较大:数据和索引共存导致节点大小较大,影响缓存效果。

  • 二级索引存储复杂:非聚簇索引中的记录需要额外存储主键值来定位数据。

适用场景:

  • 主键查询或范围查询频繁的场景。

  • 数据插入和更新相对较少的场景。 

二、非聚簇索引Non-Clustered Index

定义:

非聚簇索引是一种索引与数据分离的索引方式。

  • 索引存储的是数据的位置,而不是数据本身。

  • 数据行的存储顺序与索引无关。 

特点:

  • 索引独立于数据:索引的叶子节点存储数据的指针(或主键值)。

  • 一张表可以有多个非聚簇索引:允许在不同列上建立多个索引。

  • 支持灵活查询:可以为经常被查询的列创建非聚簇索引。

存储方式:

  • 索引结构:基于 B+ 树。

  • 叶子节点:存储键值和指向表数据的指针或主键值。

  • 叶子节点:存储键值和指向子节点的指针。 

优点:

  • 支持多个索引:灵活优化查询性能。

  • 占用存储空间小:索引结构更紧凑。

  • 插入、更新效率高:不会影响数据存储顺序。 

缺点:

  • 查询性能稍低:需要通过索引找到指针(或主键值),再访问数据,称为“回表”。

  • 二次 I/O 操作:范围查询时需要大量回表操作,性能可能受影响。

适用场景:

  • 复杂查询场景,例如多列查询或非主键查询。

  • 数据更新和插入频繁的场景。 

三、示例说明

假设有一个学生表 students,包含以下列:

• id(主键)

• name

• age

• score

聚簇索引示例

若 id 是主键,表将以 id 列构建聚簇索引,数据按 id 的顺序存储。例如:

聚簇索引(B+ 树叶子节点

(id: 1, name: Alice, age: 20, score: 90)

(id: 2, name: Bob, age: 21, score: 85)

(id: 3, name: Charlie, age: 22, score: 95)

非聚簇索引示例

为 name 列创建非聚簇索引,索引存储 name 和主键 id,表数据与索引分离。例如:

非聚簇索引(B+ 树叶子节点  数据表

(name: Alice, id: 1)                (id: 1, name: Alice, age: 20, score: 90)

(name: Bob, id: 2)                 (id: 2, name: Bob, age: 21, score: 85)

(name: Charlie, id: 3)            (id: 3, name: Charlie, age: 22, score: 95)

查询 name='Bob' 时,非聚簇索引会找到 id=2,然后回表查找数据。

四、总结

索引类型

优点

缺点

适用场景

聚簇索引

查询速度快,范围查询高效;数据按索引顺序存储。

插入/更新效率较低;每张表只能有一个聚簇索引。

读多写少,主键或范围查询频繁的场景。

非聚簇索引 

支持多个索引;更新操作对数据影响较小。

查询需要回表,性能较聚簇索引略低。

复杂查询、非主键查询或写操作较多的场景。


http://www.ppmy.cn/devtools/140682.html

相关文章

TTC模型(1D和2D)理论推导及python实现

目录 第一部分:TTC模型理论背景与应用场景1.1 什么是TTC?1.2 为什么需要TTC?1.3 应用场景第二部分:TTC模型理论推导(1D 和 2D)2.1 1D模型推导距离公式2.2 2D模型推导相对位置与速度第三部分:Python实现:TTC模型计算(面向对象设计)3.1 Python实现的一维TTC代码实现3.2…

C++平常学习用的

4.1 友元函数 4.2 友元类 5.2 类模板 7.2 虚函数dynamic_cast运算 7.2 纯虚函数和抽象类

webpack 题目

文章目录 webpack 中 chunkHash 和 contentHash 的区别loader和plugin的区别?webpack 处理 image 是用哪个 loader,限制 image 大小的是...;webpack 如何优化打包速度 webpack 中 chunkHash 和 contentHash 的区别 主要从四方面来讲一下区别&…

Nginx配置中server_name参数未生效的问题解决

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

解谜类游戏《迷失岛2》等如何抽象出一套通用高效开发框架?

解谜类游戏以精妙的谜题设计和引人入胜的故事叙述为特点,考验着玩家的智慧与观察力。《迷失岛2》与《南瓜先生2九龙城寨》正是这一领域的佳作。游戏以独特的艺术风格和玩法设计吸引了大量玩家,而它们背后隐藏着一套强大的框架。 上海胖布丁游戏的技术总…

mysql 和 tidb的区别

MySQL 和 TiDB 是两种常见的关系型数据库管理系统,但它们的设计理念和适用场景有显著区别。以下从架构、性能、扩展性、适用场景等方面进行对比: 架构设计 MySQL 单机架构为主,可通过主从复制实现读写分离或高可用。分布式支持依赖外部组件&…

学习CSS第二天

学习文章目录 一.内部样式 一.内部样式 写在 html 页面内部&#xff0c;将所有的 CSS 代码提取出来&#xff0c;单独放在 <style> 标签中 语法&#xff1a; <style> h1 { color: red; font-size: 40px; } </style>注意点&#xff1a; <style> 标签理…

Idea Spring Initializr没有 Java 8选项解决办法

问题描述 在使用IDEA中的Spring Initializr创建新项目时&#xff0c;Java 版本近可选择Java17,21 。不能选择Java8;SpringBoot 版本也只有 3.x 问题原因 Spring 官方&#xff08; https://start.spring.io/&#xff09;不再提供旧版本的初始化配置 解决方案 方案 1 使用阿里…