MySQL 集群索引和非集群索引的区别
集群索引和非集群索引的区别是数据库相关面试中最有名的问题。这两种索引具有相同的物理结构,并以BTREE结构存储在MySQL服务器数据库中。在本节中,我们将解释它们之间最常见的差异。
在MySQL中进行索引是一个帮助我们快速返回所请求数据的过程。如果表没有索引,它会扫描整个表以查找所请求的数据。 MySQL 允许两种不同类型的索引:
- 集群索引
- 非集群索引
让我们首先简要讨论一下集群索引和非集群索引。
什么是集群索引?
集群索引是一种表,其中存储了行数据。它根据主键值或唯一键值来定义表数据的顺序,只能按照一个方向进行排序。在数据库中,每个表只能包含一个集群索引。在关系数据库中,如果表列包含主键或唯一键,MySQL允许您基于该特定列创建一个名为 PRIMARY 的集群索引。
示例
下面的示例说明了如何在MySQL中创建集群索引:
CREATE TABLE Student
( post_id INT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL,
CONSTRAINT Post_PK
PRIMARY KEY (user_id, post_id), //clustered index
CONSTRAINT post_id_UQ
UNIQUE (post_id)
) ENGINE = InnoDB ;
特点
下面是聚簇索引的主要特点:
- 它允许我们将数据和索引一起存储。
- 它根据键值以一种方式存储数据。
- 键查找。
- 它支持索引扫描和索引查找数据操作。
- 聚簇索引总是使用一个或多个列来创建索引。
什么是非聚簇索引?
非聚簇索引是指除主索引(聚簇索引)之外的索引。非聚簇索引也称为二级索引。非聚簇索引和表数据存储在不同的位置。它无法对表数据进行排序。非聚簇索引的工作方式类似于一本书,内容写在一个地方,索引写在另一个地方。MySQL允许表存储一个或多个非聚簇索引。非聚簇索引改善了在没有分配主键的情况下使用键的查询性能。
示例
//It will create non-clustered index
CREATE NonClustered INDEX index_name ON table_name (column_name ASC);
特性
以下是非聚集索引的基本特点:
- 它仅存储键值。
- 它允许访问指向物理行的辅助数据。
- 它有助于索引的扫描和搜索操作。
- 一个表可以包含一个或多个非聚集索引。
- 非聚集索引行存储非聚集键和行定位器的值。
聚集索引与非聚集索引对比
让我们通过表格形式看一些聚集索引和非聚集索引之间的主要区别:
参数 | 聚集索引 | 非聚集索引 |
---|---|---|
定义 | 聚集索引是一种存储行数据的表。在关系数据库中,如果表的列包含主键,MySQL会自动创建一个名为 PRIMARY 的聚集索引。 | 非聚集索引是指除主索引(聚集索引)以外的索引。非聚集索引也被称为二级索引。 |
用途 | 可用于对记录进行排序并将索引存储在物理内存中。 | 它创建了数据行的逻辑顺序,并使用指针来访问物理数据文件。 |
大小 | 聚集索引的大小较大。 | 非聚集索引的大小较聚集索引小。 |
数据访问 | 它能够非常快速地访问数据。 | 相对于聚集索引,非聚集索引的访问速度较慢。 |
存储方式 | 它将记录存储在索引的叶节点中。 | 它不会将记录存储在索引的叶节点中,这意味着它需要额外的空间来存储数据。 |
额外磁盘空间 | 它不需要额外的磁盘空间。 | 它需要额外的空间来单独存储索引。 |
键的类型 | 它使用主键作为聚集索引。 | 它可以使用作为复合键的唯一约束工作。 |
包含于表中 | 一张表只能有一个聚集索引。 | 一张表可以包含一个或多个非聚集索引。 |
索引ID | 聚集索引始终包含索引ID 0。 | 非聚集索引始终包含索引ID大于0。 |