数据库之聚簇索引和非聚簇索引的区别

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

聚簇索引(密集索引)文件中的每个搜索码值都对应一个索引值(叶子节点不仅保存了键值,还保存了位于同一行记录中的其他列的信息),因为聚簇索引决定了表的物理排列顺序,而一个表只能有一种物理排列顺序,所以一个表只能创建一个聚簇索引。

非聚簇索引(稀疏索引)文件只为索引码的某些值建立索引项(叶子节点仅保存了键值以及该行数据的地址)。

数据库必须要有索引,没有索引则检索过程变成了顺序查找(全表扫描),O(n)的时间复杂度几乎是不能忍受的。我们非常容易想象出一个只有单关键字组成的表如何使用B+树进行索引,只要将这个关键字存储到B+树的节点即可。当数据库一条记录里包含多个字段时,一棵B+树就只能存储主键,如果检索的是非主键字段,则主键索引失去作用,又变成顺序查找(全表扫描)了。这时应该在第二个要检索的列上建立第二套索引(辅助键索引),这个索引由独立的B+树来组织。有两种常见的方法可以解决多个B+树访问同一套表数据的问题,一种叫做聚簇索引(数据和索引存储在一块,索引结构的叶子节点保存了行数据),一种叫做非聚簇索引(数据和索引分开存储,索引结构的叶子节点存储的是指向存放数据的物理块的指针)。

目前,MySQL数据库使用的比较主流的存储引擎有InnoDB和MyISAM,其中InnoDB存储引擎使用的是聚簇索引,而MyISAM存储引擎使用的是非聚簇索引。

InnoDB存储引擎使用聚簇索引并且有且仅有一个聚簇索引(因为聚簇索引决定了表的物理排列顺序,而一个表只能有一种物理排列顺序,因此一个表只能创建一个聚簇索引)。若有一个主键被定义,则该主键作为聚簇索引;若没有主键被定义,则该表的第一个唯一非空索引作为聚簇索引;如果不满足以上条件(没有定义主键,也没有合适的唯一索引),则该表会自动生成一个隐藏主键作为聚簇索引。InnoDB存储引擎必须要有一个主键,且该主键必须作为聚簇索引。

MyISAM存储引擎中的主键索引、唯一索引、普通索引都是非聚簇索引。

如图所示是一张包含2个列的表(以col1作为primary key):
在这里插入图片描述
在InnoDB存储引擎中,主键索引的B+树的叶子节点存储了主键值、事务ID(Transaction ID, TID)、回滚指针(Rollback Pointer, RP,用于支持事务和MVCC)以及该行记录中其他列的值。
在这里插入图片描述
在InnoDB存储引擎中,辅助键索引(二级索引)的B+树的叶子节点存储了Key字段和主键值。
在这里插入图片描述
在MyISAM存储引擎中,是按照列值和行号来组织索引的,其B+树的叶子节点存储了指向存放数据的物理块的指针。
在这里插入图片描述
InnoDB使用的是聚簇索引。将主键组织到一棵B+树(这棵B+树称为主键索引的B+树)中,这棵B+树的非叶子节点只存储了主键值,而行数据(主键的值和其他非主键的列的值)则存储在这棵B+树的叶子节点上,若使用"where id = 14"这样的搜索条件(过滤条件)查找主键(id列),则直接按照主键索引的B+树的检索算法即可查找到对应的叶子节点,之后获得整个行数据。若对Name列(非主键的列)进行条件搜索,则需要两个步骤:第一步在辅助键索引(二级索引)的B+树中检索Name,到达其叶子节点获取对应的主键值(id)。第二步使用找到的主键值(id)在主键索引的B+树中再执行一次B+树的检索操作,最终到达叶子节点即可获取对应的整个行数据。在InnoDB存储引擎中,主键索引的B+树的叶子节点存储了主键值(primary key column)、事务ID(transaction ID,TID)、回滚指针(rollback pointer,RP,用于支持事务和MVCC)和其他非主键的列的值;辅助键索引(二级索引)的B+树的叶子节点存储了Key字段和主键值。

MyISAM使用的是非聚簇索引。非聚簇索引的两棵B+树看上去没有什么不同,节点的结构完全一致,只是存储的内容不同而已。主键索引的B+树的节点存储了主键,辅助键索引(二级索引)的B+树的节点存储了辅助键。表数据存储在独立的地方,这两棵B+树的叶子节点都使用一个指针指向真正的表数据,对于表数据来说,这两个键(主键和辅助键)没有任何差别。由于这两棵索引树是独立的,通过辅助键索引(二级索引)无需访问主键索引的索引树。在MyISAM的存储引擎中,其主键索引和辅助键索引(二级索引)没有任何区别,都是按照列值和行号来组织索引的,在叶子节点处保存的都是指向存放数据的物理块的指针(数据的物理地址),其主键索引仅仅只是一个名为primary的唯一的非空的索引,且MyISAM可以不设置主键。从MyISAM存储的物理文件中我们也能看出,MyISAM存储引擎的索引文件(.MYI)和数据文件(.MYD)是相互独立的。
在这里插入图片描述
在这里插入图片描述

索引 vs 非聚簇索引:一文讲透核心原理与区别 索引(Clustered Index)是一种数据索引“绑在一起”的结构索引的叶子节点存储的就是完整的行数据本身!所以在 InnoDB 中,主键索引(PRIMARY KEY)就是索引非聚簇索引(Secondary Index)叶子节点并不直接存储数据行,而是存储主键值(row id)。也就是说:查找时你要先查二级索引 → 再通过主键回表去索引查真正数据。这个过程叫做回表查询。特性索引(主键)非聚簇索引(二级索引)是否保存整行数据✅ 是❌ 否(只存主键)是否按顺序排列。 阅读详情

相关推荐

数据库面试题10MYSQL索引非聚簇索引区别

摘要:InnoDB存储引擎中,索引(Clustered Index)非聚簇索引(Secondary Index)存在本质区别索引只有一个,决定数据物理存储顺序,叶子节点包含完整数据行;非聚簇索引可有多个,叶子节点仅存储索引主键,查询需回表操作。索引适合主键/范围查询,但插入顺序敏感;非聚簇索引可实现覆盖索引优化。设计时需合理选择主键、利用覆盖索引并控制索引数量,以平衡查询性能与维护成本。

qq_39275653的博客 607

索引非聚簇索引有什么区别?】

索引非聚簇索引有什么区别?】

学无止境 2811

DeepSeek介绍一下索引非聚簇索引的定义区别,以及优缺点?

- 例如:通过非聚簇索引`idx_name`查询`name='Alice'`的数据1.查`idx_name`索引,找到`name='Alice'`对应的主键值(如`id=100`)2.查索引,通过`id=100`定位到数据行。- 主键查询极快<br>- 范围查询高效(如BETWEEN、排序)<br>- 减少磁盘I/O。- 灵活创建多个索引<br>- 更新非主键列时开销小<br>- 适合高频查询非主键列。- 需回表,增加I/O<br>- 索引可能占用较大空间<br>- 范围查询效率低。

m0_58341177的博客 1350

索引非聚簇索引有什么区别

索引非聚簇索引有什么区别

学无止境 446

索引非聚簇索引区别

这就是雷同于索引的功效了,索引,实际存储的循序结构与数据存储的物理机构是一致的,所以通常来说物理顺序结构只有一种,那么一个表的索引也只能有一个,通常默认都是主键,设置了主键,系统默认就为你加上了索引,当然有人说我不想拿主键作为索引,我需要用其他字段作为索引,当然这也是可以的,这就需要你在设置主键之前自己手动的先添加上唯一的索引,然后再设置主键,这样就木有问题啦。索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

glenshappy的专栏 2945

索引与非索引区别

根本区别: 表记录的排列顺序索引的排序顺序是否一致。 1、索引一个表只能有一个,而非索引一个表可以存在多个。 2、索引存储记录是物理上连续存在,而非索引是逻辑上的连续,物理存储并不连续。 3、索引:物理存储按照索引排序;索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序。 4、非索引:物理存储不按照索引排序;非索引则就是普通索引了,仅仅只是对数据列创建响应的索引,不影响整个表的物理存储顺序。 5、索引是通过二叉树的数据结构...

qq_36580990的博客 5692

Mysql数据库索引的理解及索引非聚簇索引区别

Mysql数据库索引的理解及索引非聚簇索引区别 概念 索引是帮助Mysql搞笑获取数据的数据结构 对Mysql数据库来讲,其核心就是存储引擎,而索引就是属于存储引擎级别的概念,不同的存储引擎对索引的实现方式是不同的。 索引的优点 1.提高数据检索效率,降低数据库的IO成本 2.通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗 3.大大加快了数据的查询速度 索引的缺点 1.创建...

双目失明丝毫不影响我带崩三路 1827

数据库索引非聚簇索引区别

索引的叶子节点存储的是指向数据行的指针,而不是数据行本身。这意味着索引数据的物理存储顺序是分开的,索引仅提供了一种查找数据行的途径,而不决定数据的实际存储顺序。换句话说,索引决定了数据的物理存储顺序,因此表中的数据行实际上是按照索引的顺序存储的。:适合经常需要单值查找或跳跃式访问的列,因为索引存储的是指向数据行的指针,可以快速定位到需要的数据行。:由于数据行的物理存储顺序索引的顺序是一致的,因此插入、更新删除操作可能需要重新组织数据行的存储顺序,这可能会导致性能损失。

一个专注于技术研究创新的程序员 528

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

索引的重要性数据库性能优化中索引绝对是一个重量级的因素,可以说,索引使用不当,其它优化措施将毫无意义。索引(Clustered Index)非聚簇索引(Non- Clustered Index)最通俗的解释是:索引的顺序就是数据的物理存储顺序,而对非聚簇索引索引顺序与数据物理排列顺序无关。举例来说,你翻到新华字典的汉字“爬”那一页就是P开头的部分,这就是物理存储顺序(索引);而不用你到目录,找到汉字“爬”所在的页码,然后根据页码找到这个字(非聚簇索引)。下表给出了何时使用索引与非索.

唐者荣耀的博客 1900

mysql数据库-索引非聚簇索引区别

建立索引的目的 建立索引的目的是为了加快查询速度,但是索引并不是万能的,靠索引并不能实现对所有数据的快速存取。如果索引策略数据检索的需求不想匹配的话,建立索引会降低查询性能。 建立索引的语句 CREATE CLUSTER INDEX index_name ON table_name(column_name1,column_name2,...); 索引的分类 索引:表中的数据按照索引的顺序进行存储,也就是说索引项的顺序表中记录的为例顺序保持一致,对于索引,叶子节点存储了真实的数据行,不再有单独

qq_41836319的博客 709

java八股文面试[数据库]——MySql索引非聚簇索引区别

索引指定了表中记录的逻辑顺序,但记录的物理顺序索引的顺序不一致,索引索引都采用了B+树的结构,但非索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。分析:如果认为是的朋友,可能是受系统默认设置的影响,一般我们指定一个表的主键,如果这个表之前没有索引,同时建立主键时候没有强制指定使用非索引,SQL会默认在此字段上创建一个索引,而主键都是唯一的,所以理所当然的认为创建索引的字段也需要唯一。非索引层次多,不会造成数据重排。

u200814342A的博客 851

两种数据库引擎(非索引

数据库及对应的索引结构

vgfvgf的博客 177

MySQL面试问题

mysql有关权限的表都有哪几个 MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_privhost。下面分别介绍一下这些表的结构内容: user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。 db权限表:记录各个帐号在各个数据库上的操作权限。 table_priv权限表:记录数据表级的操作权限。 columns_priv权限表:记录数

努力努力再努力的博客 140

mysql索引非聚簇索引区别_索引非聚簇索引区别

通常情况下,建立索引是加快查询速度的有效手段。但索引不是万能的,靠索 引并不能实现对所有数据的快速存取。事实上,如果索引策略数据检索需求严重不符的话,建立索引反而会降低查询性能。因此在实际使用当中,应该充分考虑到 索引的开销,包括磁盘空间的开销及处理开销(如资源竞争加锁)。例如,如果数据频繁的更新或删加,就不宜建立索引。本文简要讨论一下索引的特点及其与非聚簇索引区别。建立索引:在SQL语...

weixin_28728425的博客 3630

MySQL - 索引非聚簇索引

索引非聚簇索引B+Tree的叶子节点存放主键索引行记录就属于索引;如果索引行记录分开存放就属于非聚簇索引。主键索引辅助索引B+Tree的叶子节点存放的是主键字段值就属于主键索引;如果存放的是非主键值就属于辅助索引(二级索引)。在InnoDB引擎中,主键索引采用的就是索引结构存储。...

迪曼奥特迦-博客 3831

MySQL面试题——索引非聚簇索引

1.索引非聚簇索引的概念 1.1索引 将数据存储与索引放到了一块,找到了索引也就找到了数据,当表有索引时,它的数据实际上存放在索引的叶子页上,也就是B+树的叶子节点上,因为数据行不能存在两个地方,所以一个表只能有一个索引,在InnoDB中通过主键集数据,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为索引 1.2非聚簇索引 将数据存储与索引分开,索引结构的叶子节点指向了数据的对应行,在非聚簇索引中,索引中的逻辑顺序并

clearLB的博客 3318

索引非聚簇索引

而在InnoDB中,索引的B+树的叶子节点是一个数据页,默认大小为16K,这些叶子节点,也就是数据页的数据其实是一个有序链表,会按照主键递增的顺序来存储。在InnoBD中通过主键来数据,也就是说索引的的B+树上的叶子节点所存储的key总是主键值,如果没有定义主键,InnoDB会选择一个唯一的非空索引来代替,如果也没有这样的索引,InnoDB会隐式地定义一个主键来数据,这个隐式的主键被称为 rowID。讲完索引,接下来我们来聊一下非聚簇索引,也就是我们平常进程提起使用的常规索引

BlueProtocolBlog 1875

MySQL索引索引非聚簇索引区别

目录 1.索引非聚簇索引的概念 2.两者详细介绍 3. 两者的区别 3.1 数据存储方式 3.2二级索引查询 1.索引非聚簇索引的概念 数据库表的索引从数据存储方式上可以分为索引非聚簇索引两种。“”的意思是数据行被按照一定顺序一个个紧密地排列在一起存储。我们熟悉的InnoDBMyISAM两大引擎,InnoDB的默认数据结构是索引,而MyISAM是非聚簇索引索引(Clustered Index)并不是一种单独的索引类型,而是一种数据存储方式。当表有了..

baidu_15952103的博客 2万+

什么是索引非聚簇索引,如何理解回表、索引下推

在 InnoDB 中,索引 B+树的叶子节点存储了整行数据的是主键索引,也被称为索引。而索引 B+树的叶子节点存储了主键的值的是非主键索引,也被称为非聚簇索引。在数据存储方面,主键(索引的 B+树的叶子节点直接包含了我们要查询的整行数据。而非主键(非索引的叶子节点则包含了主键的值。因此,当我们通过非聚簇索引进行查询时,首先会通过非聚簇索引查找到主键的值,然后需要再通过主键的值进行一次查询才能获取到我们要查询的数据。这个过程称为回表。

fasheng0102的专栏 686
上一篇: 数据库之索引的数据结构
下一篇: 数据库的优化问题
攻城晓狮子
博客等级 码龄7年 5粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值