聚簇索引和非聚簇索引

索引的分类

MySQL索引根据物理存储的形式,分为聚簇索引和非聚簇索引。

聚簇索引 (InnoDB)

聚簇索引(clustered index),也叫作聚集索引。

数据存储与索引放到了一块,索引结构的叶子节点保存了行数据

表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。

那么这个innodb,他除了这个聚簇索引,像什么复合索引,前缀索引,还有这唯一索引,他们都是在这个聚簇索引的基础之上建立的索引。所以他们也统称为辅助索引

聚簇索引它是一个概念,它默认的实现是这个主键索引。主键索引就是聚簇索引他实现之一,如果你这个表里没有这个主键索引,InnoDB就会选择一个唯一的非空索引代替。
如果连唯一的索引都没有的话,这个InnoDB就会在内部生成一个隐式的聚簇索引。

就是无论怎么样,这个InnoDB都会有一个唯一的聚簇索引。

非聚簇索引(MyISAM)

将数据与索引分开存储,表数据存储顺序与索引顺序无关。

查非聚簇索引存在的回表问题

去查一个非主键索引,然后这个非主键索引最后查询到的东西其实是一个主键。这样的话,你还要根据那个主键去回表,再去查,去查那个主键索引,再去查一遍,这就是它的一个回表的情况。

聚簇索引的原理

InnoDB里只有主键是有聚簇索引的。它根据那个索引直接能查到那个数据的一些信息。因为它那个就是索引段,是直接和数据绑定在一起的。

聚簇索引就是按照每张表的主键构造一棵B+树,同时叶子节点中存放了表的行记录数据。

举例说明

先创建一张表:

create table customer(
	cust_id INT(10) NOT NULL,
	name varchar(16),
	phone_no varchar(16),
	PRIMARY KEY(`cust_id`) USING BTREE,
) engine = InnoDB;

插入几条测试数据之后,聚簇索引如图:
在这里插入图片描述
可以看到,聚簇索引的叶子节点包含了整张表的行记录数据。

同B+树数据结构一样,每个数据页都通过一个双向链表来进行来链接。

如果没有指定主键

如果没有明确指定主键或唯一键,它会自动选择一个作为默认索引,其为“隐式聚簇索引”。

需要注意的是,隐式聚簇索引可能并不是最优的选择,因为它可能会选择一个不太适合作为聚簇索引的列。

其他引擎

不是所有数据库引擎都遵循相同的规则来保证每张表都有聚簇索引。之前回答都是基于默认引擎InnoDB所提供的规则。

MyISAM

例如MyISAM并不适用聚簇索引的概念。相反,它使用了一种不同的索引结构,将数据存储在索引文件和数据文件中分开存储。

在这种情况下,每张表都有一个主键索引,但它不是聚簇索引。而是根据主键的值来排序数据,但数据本身不与索引结构绑定。

其他数据库系统

也存在类似的差异。例如PostgreSQL支持多种引擎,其中包括默认的B-tree索引引擎和针对特定用途的其他引擎,如全文搜索引擎和时空索引引擎。

这些引擎可能具有不同的索引实现方式,不一定都会使用聚簇索引。

聚簇索引的优点

通过聚簇索引查找目标数据时理论上比非聚簇索引要快。

因为聚簇索引能够在B+树索引的叶子节点上直接找到数据。

非聚簇索引查找目标数据需要多一次索引查询

此外,由于定义了数据的逻辑顺序,聚簇索引能够特别快地访问一定范围内的数据。

聚簇索引逻辑上的连续性

聚簇索引的存储并不是物理上的连续,而是逻辑上的连续。

数据页之间通过双向链表链接,按照主键的顺序排序。

数据页之内的记录是通过单向链表进行维护的,物理存储上可以同样不按照主键的顺序存储。

非聚簇索引

非聚簇索引(non clustered index),也称为二级索引、辅助索引。

聚簇索引与非聚簇索引的区别

在这里插入图片描述

聚簇索引的叶节点存放表的行记录数据。

非聚簇索引叶节点存的是指针指向对应的数据块

即聚簇索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点

参考资料

  1. 两分钟掌握聚簇索引!
  2. 我来告诉你,MySQL是如何通过【索引】找到一条【真实的数据】
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值