当前位置: 首页 > news >正文

详解 MySQL InnoDB 引擎中的聚簇索引和非聚簇索的区别

MySQL InnoDB 引擎中的 聚簇索引(Clustered Index)非聚簇索引(Non-Clustered Index) 有以下几个主要区别:

1. 数据存储方式

  • 聚簇索引(Clustered Index):数据的存储顺序和索引的顺序是相同的。也就是说,表中的数据按照聚簇索引的顺序物理存储在磁盘上。因此,聚簇索引直接决定了数据表的存储顺序。

    在 InnoDB 中,主键索引就是聚簇索引。数据行本身存储在 B+ 树的叶子节点中。

  • 非聚簇索引(Non-Clustered Index):非聚簇索引的存储顺序与数据的物理存储顺序无关。它是一个独立的索引结构,存储索引列的值以及与该值相关的数据行的指针(或者称为 ROWID)。非聚簇索引的叶子节点存储的是指向数据行的指针,而不是数据本身。

2. 索引和数据的关系

  • 聚簇索引:数据表的主键索引默认就是聚簇索引。聚簇索引的叶子节点中存储了完整的数据记录,因此读取时会直接返回数据。

  • 非聚簇索引:非聚簇索引并不包含数据行本身,而是包含数据行的指针。非聚簇索引需要通过索引值找到数据记录,然后再去表中查找对应的数据行。这种查找过程称为“回表”。

3. 存储结构

  • 聚簇索引:聚簇索引的 B+ 树的叶子节点包含了实际的数据行。当你创建一个聚簇索引时,数据表会按照该索引进行排序。由于数据表中的数据按聚簇索引顺序排列,因此表中只能有一个聚簇索引。

  • 非聚簇索引:非聚簇索引的 B+ 树叶子节点仅包含索引字段的值和对应数据行的指针。因此,同一表中可以有多个非聚簇索引。

4. 性能

  • 聚簇索引:聚簇索引对于范围查询(如 BETWEEN>, <)非常高效,因为数据在磁盘上的顺序已经和索引顺序一致。通常聚簇索引对于数据的插入、删除和更新较为高效,因为这些操作不需要像非聚簇索引那样额外维护指针。

  • 非聚簇索引:非聚簇索引查询效率相对较低,因为它们需要额外的回表操作,首先从索引中查找目标记录的指针,再去表中查找实际的数据。

5. 索引数量

  • 聚簇索引:每个表只能有一个聚簇索引,因为数据本身只能按一种顺序进行存储。

  • 非聚簇索引:每个表可以有多个非聚簇索引,这些索引可以根据不同的查询需求创建。

6. 使用场景

  • 聚簇索引:适合那些查询时经常依赖范围扫描的场景(如日期、ID 范围等),并且通常用于主键索引。

  • 非聚簇索引:适合经常进行特定列查询的场景,比如经常按某个字段查找的情况,或查询条件中经常使用非主键字段。

总结

  • 聚簇索引:数据按照索引顺序存储在磁盘上,只有一个,通常是主键索引。
  • 非聚簇索引:索引结构独立于数据存储,包含指向数据的指针,可以有多个。

对比

特性聚簇索引 (Clustered Index)非聚簇索引 (Non-Clustered Index)
数据存储顺序数据存储顺序和索引顺序一致,数据按照索引顺序存储数据存储顺序与索引无关,索引与数据表分开存储
数据存储位置数据本身存储在索引的叶子节点中数据不在索引中,索引存储的是指向数据行的指针
表中的索引数量每个表只能有一个聚簇索引(通常是主键索引)每个表可以有多个非聚簇索引
查询效率对范围查询非常高效,直接返回数据查找索引后需要回表操作,查询效率相对较低
回表操作无需回表操作,索引和数据在同一结构中需要回表操作,从索引中查找指针,再访问实际数据行
维护成本插入、删除和更新操作可能会导致数据重排,性能受影响需要单独维护指针,删除或插入时可能需要更新索引结构
存储结构索引的叶子节点存储实际数据索引的叶子节点存储索引值和指向数据行的指针
适用场景适用于主键查询、范围查询等,通常用于主键索引适用于单列或多列的查询索引,通常用于快速查找非主键字段
创建方式通过创建主键或唯一索引时自动创建(默认主键是聚簇索引)通过 CREATE INDEX 语句显式创建
http://www.dtcms.com/a/106681.html

相关文章:

  • OpenCV边界填充方法详解
  • Python入门(6):面向对象编程(OOP)
  • Smith Chart阻抗匹配
  • elasticsearch 7.17 索引模板
  • 一段式端到端自动驾驶:UniAD:Planning-oriented Autonomous Driving
  • python函数装饰器
  • (linux操作系统)环境变量
  • 【NS3-如何在NS3中模拟每个节点的本地时钟?
  • 自动获取屏幕尺寸信息的html文件
  • [图文]directed不是direct-《分析模式》漫谈50
  • 算法刷题记录——LeetCode篇(3.10) [第291~300题](持续更新)
  • 【Java中级】10章、内部类、局部内部类、匿名内部类、成员内部类、静态内部类的基本语法和细节讲解配套例题巩固理解【5】
  • 《AI大模型应知应会100篇》第7篇:Prompt Engineering基础:如何与大模型有效沟通
  • SAP BDC应用1-批量处理财务三大报表
  • Java 代理模式 详解
  • 4.2学习总结
  • Vue与React区别分析
  • 机器学习开发全流程详解:从数据到部署的完整指南
  • el-dialog实现遮罩层后面的内容也能点击
  • SqlServer整库迁移至Oracle
  • 鹧鸪云光伏仿真软件场外设计功能:构建系统级工程闭环
  • time.sleep(10)和 async 区别
  • 通信算法之251: 时频图谱spectrogram(如短时傅里叶变换STFT)
  • 数据结构——队列的实现
  • LeetCode算法题(Go语言实现)_26
  • LLM大模型之精度问题(FP16,FP32,BF16)详解与实践
  • Mapreduce的使用
  • 深入理解归并排序:分治艺术的经典实践
  • 【AI产品分享】面向图片的原始位置翻译功能
  • Redisson中BitMap位图的基本操作