聚簇索引和非聚簇索引
聚簇索引的简介
- 索引的分类
- 聚簇索引 (InnoDB)
- 非聚簇索引(MyISAM)
- 查非聚簇索引存在的回表问题
- 聚簇索引的原理
- 举例说明
- 如果没有指定主键
- 其他引擎
- MyISAM
- 其他数据库系统
- 聚簇索引的优点
- 聚簇索引逻辑上的连续性
- 非聚簇索引
- 聚簇索引与非聚簇索引的区别
索引的分类
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),也称为二级索引、辅助索引。
聚簇索引与非聚簇索引的区别
聚簇索引的叶节点存放表的行记录数据。
非聚簇索引叶节点存的是指针,指向对应的数据块。
即聚簇索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点。
参考资料:
- 两分钟掌握聚簇索引!
- 我来告诉你,MySQL是如何通过【索引】找到一条【真实的数据】
还没有评论,来说两句吧...