【MySQL】MySQL索引--聚簇索引和非聚簇索引的区别

news2024/10/7 20:32:08

文章目录

  • 前言
  • 1.聚簇索引和非聚簇索引的概念
  • 2.两者详细介绍
    • 2.1 聚簇索引
    • 2.2 非聚簇索引
  • 3. 两者的区别
    • 3.1 数据存储方式
    • 3.2 二级索引查询

前言

1.聚簇索引和非聚簇索引的概念

数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引两种。“聚簇”的意思是数据行被按照一定顺序一个个紧密地排列在一起存储。我们熟悉的InnoDB和MyISAM两大引擎,InnoDB的默认数据结构是聚簇索引,而MyISAM是非聚簇索引。

聚簇索引(Clustered Index)并不是一种单独的索引类型,而是一种数据存储方式。当表有了聚簇索引的时候,表的数据行都存放在索引树的叶子页中。无法把数据行放到两个不同的地方,所以一张表只允许有一个聚簇索引。InnoDB的聚簇索引实际上是将索引和数据保存中同一个B-Tree中。InnoDB通过主键聚集数据,如果没有定义主键,InnoDB会选择一个唯一的的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。

非聚簇索引(NoClustered Index),又叫二级索引。二级索引的叶子节点中保存的不是指向行的物理指针,而是行的主键值。当通过二级索引查找行,存储引擎需要在二级索引中找到相应的叶子节点,获得行的主键值,然后使用主键去聚簇索引中查找数据行,这需要两次B-Tree查找。

2.两者详细介绍

2.1 聚簇索引

因为聚簇和非聚簇索引本质上是数据存储方式,需要依赖于载体,即以InnoDB引起来讲解聚簇索引,以MyISAM来讲解非聚簇索引。下述讲解的图都引用自《高性能MySQL》。

对于InnoDB引擎来说,是按照聚簇索引的形式存储数据:
在这里插入图片描述

它的每个聚簇索引的叶子节点都包含主键值、事务ID、回滚指针(用于事务和MVCC)以及余下的列。从物理文件也可以看出 InnoDB的数据文件只有数据结构文件.frm和数据文件.ibd 其中.ibd中存放的是数据和索引信息 是存放在一起的。

InnoDB的二级索引和主键索引也有很大的不同,二级索引存放的是主键值而不是行指针,减少了移动数据或者分裂时维护二级索引的开销,因为不需要更新索引的行指针。

在这里插入图片描述

  • 聚簇索引的特点:

    • 优点:

      1. 可以把相关数据保存在一起。例如实现电子邮箱时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少量的数据页就能获取某个用户全部邮件,如果没有使用聚集索引,则每封邮件都可能导致一次磁盘IO。
      2. 数据访问更快,聚集索引将索引和数据保存在同一个B-Tree中,因此从聚集索引中获取数据通常比在非聚集索引中查找要快。
      3. 使用覆盖索引扫描的查询可以直接使用页节点中的主键值。
    • 缺点:

      1. 聚簇数据最大限度地提高了IO密集型应用的性能,但如果数据全部放在内存中,则访问的顺序就没有那么重要了,聚集索引也没有什么优势了。
      2. 插入速度严重依赖于插入顺序,按照主键的顺序插入是加载数据到InnoDB表中速度最快的方式,但如果不是按照主键顺序加载数据,那么在加载完成后最好使用optimize table命令重新组织一下表。
      3. 更新聚集索引列的代价很高,因为会强制InnoDB将每个被更新的行移动到新的位置。
      4. 基于聚集索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临页分裂的问题,当行的主键值要求必须将这一行插入到某个已满的页中时,存储引擎会将该页分裂成两个页面来容纳该行,这就是一次页分裂操作,页分裂会导致表占用更多的磁盘空间。
      5. 聚集索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候。
      6. 二级索引可能比想象的更大,因为在二级索引的叶子节点包含了引用行的主键列。
      7. 二级索引访问需要两次索引查找,而不是一次。

2.2 非聚簇索引

对于MyISAM引擎来说,是按照非聚簇索引的形式存储数据:

原始数据:
在这里插入图片描述

存储方式:

在这里插入图片描述

按照列值和行号来组织索引的,叶子节点中保存的实际上是指向存放数据块的指针。从物理文件中也可以看出MyISAM的索引文件.MYI和数据文件.MYD是分开存储的 是相对独立的。

举例:执行流程:select * from user where id =1
1、查看该user表的myi索引文件中有没有以id为索引的索引树
2、在id索引树上通过id值找到相应节点,从而得到节点的数据(叶子节点存的是索引值和数据地址,数据地址指向当前表myd数据文件具体的哪一行)
3、根据数据地址去myd文件里找到对应的数据返回。

在这里插入图片描述

3. 两者的区别

3.1 数据存储方式

最直观的区别是反映在数据存储方式上,在MySQL数据库中InnoDB(聚簇)和MyISAM(非聚簇)数据存储文件格式如下:

存储引擎是InnoDB, 在data目录下会看到2类文件:.frm、.ibd
(1)*.frm–表结构的文件。
(2)*.ibd–表数据文件

存储引擎是MyISAM, 在data目录下会看到3类文件:.frm、.myi、.myd
(1)*.frm–表定义,是描述表结构的文件。
(2)*.MYD–"D"数据信息文件,是表的数据文件。
(3)*.MYI–"I"索引信息文件,是表数据文件中任何索引的数据树

示意图,test1的存储引擎为InnoDB,test2的存储引擎为MyISAM:

在这里插入图片描述

聚簇索引和非聚簇索引的存储方式区别:

  1. 在MyISAM引擎索引和数据是分开存储的,而InnoDB是索引和数据是一起以idb文件的形式进行存储的。
  2. 在访问速度上,聚簇索引比非聚簇索引快。非聚簇索引需要先查询一遍索引文件,得到索引,跟据索引获取数据。而聚簇索引的索引树的叶子节点的直接指向要查找的数据行。

3.2 二级索引查询

对于采用聚簇索引的InnoDB引擎的主键索引B+Tree和MyISAM的主键索引树以及MyISAM的二级索引B+Tree都是采用这样的结构。

在这里插入图片描述

但是InnoDB的二级索引B+Tree却是这样的:

在这里插入图片描述

可以得出:
  在使用二级索引进行查询的时候,InnoDB首先通过二级索引B+Tree得到数据行的主键索引,然后再通过主键索引树查询数据。所以在二级索引,InnoDB的性能消耗比较大。
  但是,这种情况在InnoDB中有一定的优化,不是认为控制的,而是引擎实现的,通过二级索引查询多了,InnoDB会生成自适应的哈希索引。

引用高性能MySQL的图能更加清晰的看到其差异:

在这里插入图片描述

从图中可以看出 InnoDB二级索引的叶子节点存放的是KEY字段+主键值,因此首先通过二级索引查找到的是主键值,再根据主键值在主键索引中查找到相应的数据文件。而MyISAM的二级索引存放的还是列值和行号的组合 叶子节点中保存的是指向物理数据的指针,因此它的主建索引和二级索引的结构并没有任何区别,只是说主键索引的索引值是唯一且非空的,而MyISAM引擎可以不设置主键。InnoDB引擎是必须设置主键的,需要依赖主键生成聚簇索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java|golang】1072. 按列翻转得到最大值等行数

给定 m x n 矩阵 matrix 。 你可以从中选出任意数量的列并翻转其上的 每个 单元格。(即翻转后,单元格的值从 0 变成 1,或者从 1 变为 0 。) 返回 经过一些翻转后,行与行之间所有值都相等的最大行数 。 示例 1&#…

使用TensorFlow构建,绘制和解释人工神经网络

使用 Python 进行深度学习:神经网络(完整教程) 使用TensorFlow构建,绘制和解释人工神经网络 总结 在本文中,我将展示如何使用Python构建神经网络,以及如何使用可视化和创建模型预测解释器向业务解释深度学习…

【PCIE】pcie设备协议分析和crash后定位

分析RP Headerlog在协议中位置 能力集寄存器协议字段 HeaderLog字段偏移以及各字段含义 headerLog和协议的对应入截图中内容 completer id就是完成的ID,对应的BDF ,如下图 b5:00.0 AECap寄存器 其中 first error pointer 含义: 这里有专…

对于 Git 每一次提交的时间信息,什么是作者日期和提交者日期

文章目录 什么是作者日期和提交者日期如何查看作者日期和提交者日期方法 1方法 2方法 3 修改最近一次提交的时间 什么是作者日期和提交者日期 对于 Git 的每一次提交,在 TortoiseGit 和 IntelliJ IDEA 都可以看到这次提交的时间。但很多人不知道的是,Gi…

人脸识别2:Python实现人脸识别Face Recognition(含源码)

人脸识别2:Python实现人脸识别Face Recognition(含源码) 目录 人脸识别2:Python实现人脸识别Face Recognition(含源码) 1. 前言 2. 项目安装 3. 人脸识别系统 (1)人脸检测和关键点检测 (2)人脸校准 …

【数据结构与算法】布隆(Bloom Filter)过滤器

文章目录 1、什么是布隆过滤器2、布隆过滤器的使用场景3、布隆过滤器的原理3.1 数据结构3.2 空间计算3.3 增加元素3.4 查询元素3.5 修改元素3.6 删除元素 4、Redis集成布隆过滤器4.1 版本要求4.2 安装&编译4.2.1 下载插件压缩包4.2.2 解压4.2.3 编译插件 4.3 Redis集成4.3.…

《硅谷钢铁侠:埃隆·马斯克的冒险人生》成就21世纪的史诗

《硅谷钢铁侠:埃隆马斯克的冒险人生》成就21世纪的史诗 阿什利万斯(Ashlee Vance):美国商业专栏作家、资深科技记者。 文章目录 《硅谷钢铁侠:埃隆马斯克的冒险人生》成就21世纪的史诗马斯克的超级公司摘录感悟梦 马斯…

免费SSL:阿里云SSL证书免费申请入口及流程开启HTTPS

阿里云SSL免费证书在哪申请?一个阿里云账号一年可以申请20张免费SSL证书,很多同学找不到免费SSL的入口,阿小云来详细说下阿里云SSL证书免费申请入口链接以及免费SSL证书申请流程,有同学反馈阿里云免费SSL证书没有了?错…

【Python共享文件】——Python快速搭建HTTP web服务实现文件共享并公网远程访问

文章目录 1. 前言2. 视频教程3. 本地文件服务器搭建3.1 python的安装和设置3.2 cpolar的安装和注册 4. 本地文件服务器的发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用,不仅在商业和办公场景有…

[离散数学]图论

图基本概念 点相同 边相同 $$ 有向图 无向图 邻接点 :两个结点有一条有(无)向边相关联 邻接边:关联与同一个结点 孤立结点: 不予任何结点相邻接的结点 握手定理 度数边的两倍 有向图的 出度和入度和边数 n个节点无向完全图边数 C n 2 1 2 n ( n − 1 ) C_n^2…

14JS05——流程控制-分支

目标: 1、流程控制 2、顺序流程控制 3、分支流程控制if语句 4、三元表达式 5、分支流程控制switch语句 一、流程控制 在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的。很多时候我们要通过控制代码 的执行顺序来实现我们要完成的…

Science | 人体可以依靠饥饿感来延缓衰老

作为一种高级动物,人体需要六种营养物质来维持基本的生理需求:糖类、油脂、蛋白质、无机盐、水、和维生素。对营养物质的生理需求促使人和动物去追寻食物。而饮食对人和动物的行为和寿命又有着显著影响。 近年来,越来越多的研究表明&#xf…

计算机网络 二 (物理层)

物理层 概念 物理层为数据链路层屏蔽了各种传输媒体的差异,使数据链路层只需要考虑如何完成本层的协议和服务,而不必考虑网络具体的传输媒体是什么。 对于物理层有很多很多的协议,不过都不怎么重要,对于物理层我们知道物理层协议…

国产仪器仪表 1466C-V/1466D-V/1466E-V/1466G-V/1466H-V/1466L-V系列信号发生器

国产Ceyear 1466-V系列信号发生器是一款面向微波毫米波尖端测试的通用测试仪器,频率范围覆盖宽、射频调制带宽大、信号频谱纯度高,具有高准确度和大动态范围的功率输出,以及出色的矢量调制精度和ACPR性能,搭配单机双射频通道和多机…

21天学会Linux----Day1:Linux环境搭建

CSDN的uu们,大家好。这里是Linux的第一讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:Linux保姆级教程 目录 1. Linux环境搭建的三种方式 2. 阿里云学生认证白嫖七个月云服务器…

十四、Zuul网关

目录 一、API网关作用: 二、网关主要功能: 2.1、统一服务入口 2.2、接口鉴权 2.3、智能路由 2.4、API接口进行统一管理 2.5、限流保护 三、 新建一个项目作为网关服务器 3.1、项目中引入Zuul网关依赖 3.2、在项目application.yml中配置网关路由…

mmdetection 中 Mask Rcnn检测结果可视化(DICE计算、PR曲线绘制等)

mmdetection中的Mask Rcnn是一个很不错的检测网络,既可以实现目标检测,也可以实现语义分割。官方也有很详细的doc指导,但是对新手来说并不友好,刚好之前笔者写的mmlab系列里面关于可视化都还没有一个详细的文档,也在此…

JAVA常用API - Runtime和System

文章目录 前言 大家好,我是最爱吃兽奶,今天给大家带来JAVA常用API中的Runtime类和System类 那么就让我们一起去看看吧! 一、Rubtime 1.Rubtime是什么? 2.Runtime常用方法 Runtime提供了很多方法,在这里演示两个 public static Runtime getRuntime(): 返回当前运行时环境的…

ChatSQL - 文本生成SQL【LLM】

ChatSQL将用户提供的纯文本转换为 mysql 查询,基于ChatGPT实现。 推荐:用 NSDT设计器 快速搭建可编程3D场景。 1、ChatSQL简介 我们需要从一开始就指定一些关于我们数据库的信息,以便 Chatgpt 了解我们的数据库。 info.json 文件可用于此过程…

什么是胆汁酸,其与肠道微生物互作如何影响人体健康

谷禾健康 胆汁酸是一种代谢胆固醇的物质,它具有两个亲和性不同的区域,即一部分能够与水分子相互作用(亲水),而另一部分则不能与水分子相互作用(疏水)。 由于拥有这种两亲性质,胆汁酸…