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 ;
特征
以下是聚集索引的基本特征:
它使我们能够将数据和索引存储在一起。
它仅基于键值以一种方式存储数据。
关键查找。
它支持索引扫描和索引查找数据操作。
聚集索引始终使用一个或多个列来创建索引。
什么是非聚集索引?
除PRIMARY索引(聚集索引)以外的索引称为非聚集索引。非聚集索引也称为二级索引。非聚集索引和表数据都存储在不同的位置。它不能对表数据进行排序(排序)。非聚集索引与将内容写在一个地方的书相同,而索引在另一个地方。 MySQL允许一个表存储一个或多个非聚集索引。非聚集索引可提高使用键而不分配主键的查询的性能。
示例
//It will create non-clustered index
CREATE NonClustered INDEX index_name ON table_name (column_name ASC);
特征
以下是非聚集索引的基本特征:
它仅存储键值。
它允许访问具有指向物理行的指针的辅助数据。
它有助于索引扫描和查找的操作。
一个表可以包含一个或多个非聚集索引。
非聚集索引行存储非聚集键和行定位符的值。
集群VS非集群索引
让我们通过表格形式查看集群索引和非集群索引之间的一些常见差异:
聚集索引 |
非聚集索引 |
聚簇索引是存储行数据的表。在关系数据库中,如果表列包含主键,MySQL会自动创建一个名为 PRIMARY 的聚簇索引。 |
除PRIMARY索引(聚集索引)以外的索引称为非聚集索引。非聚集索引也称为二级索引。 |
它可用于对记录进行排序并将索引存储在物理内存中。 |
它创建数据行的逻辑顺序,并使用指针访问物理数据文件。 |
它的尺寸很大。 |
与聚簇索引相比,它的大小很小。 |
它非常快速地访问数据。 |
与聚簇索引相比,它的访问能力较慢。 |
它将记录存储在索引的叶节点中。 |
它不会在索引的叶节点中存储记录,这意味着它会占用额外的数据空间。 |
它不需要其他报告。 |
需要额外的空间来单独存储索引。 |
它使用主键作为聚簇索引。 |
它可以与充当复合键的唯一约束一起使用。 |
一个表只能有一个聚集索引。 |
一个表可以包含一个或多个非聚集索引。 |
聚集索引的索引ID始终为0。 |
非聚集索引始终包含索引id> 0。 |