MySQL 聚集索引和非聚集索引
聚集索引和非聚集索引的区别是数据库相关讨论中最著名的问题。两个索引具有相同的物理结构,并在 MySQL 服务器数据库中存储为 BTREE 结构。在本节中,我们将解释它们之间最流行的区别。
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 允许一张表存储一个或多个非聚集索引。非聚集索引提高了使用键而不分配主键的查询的性能。
非聚集索引的示例
CREATE NonClustered INDEX index_name ON table_name (column_name ASC);
非聚集索引的特征
以下是非聚集索引的基本特征:
- 它只存储键值。
- 它允许访问具有指向物理行的指针的辅助数据。
- 它有助于索引扫描和查找的操作。
- 一个表可以包含一个或多个非聚集索引。
- 非聚集索引行存储非聚集键和行定位器的值。
三、聚集索引 VS 非聚集索引
让我们通过表格形式来看看聚集索引和非聚集索引之间的一些差异:
比较维度 | 聚集索引 | 非聚集索引 |
---|---|---|
概念 | 聚集索引是存储行数据的表。在关系数据库中,如果表列包含主键,MySQL 会自动创建一个名为PRIMARY的聚集索引。 | PRIMARY 索引(聚集索引)以外的索引称为非聚集索引。非聚集索引也称为二级索引。 |
应用 | 它可用于对记录进行排序并将索引存储在物理内存中。 | 它创建数据行的逻辑顺序并使用指针来访问物理数据文件。 |
存储大小 | 它的尺寸很大。 | 与聚集索引相比,它的大小很小。 |
数据访问效率 | 它访问数据非常快。 | 与聚集索引相比,它的访问能力较慢。 |
储存方法 | 它将记录存储在索引的叶节点中。 | 它不在索引的叶节点中存储记录,这意味着它需要额外的数据空间。 |
额外的磁盘空间 | 它不需要额外的报告。 | 它需要额外的空间来单独存储索引。 |
key类型 | 它使用主键作为聚集索引。 | 它可以使用充当复合键的唯一约束。 |
表的包含方式 | 一张表只能有一个聚集索引。 | 一个表可以包含一个或多个非聚集索引。 |
索引 ID | 聚集索引始终包含 0 的索引 ID。 | 非聚集索引始终包含索引 id>0。 |
热门文章
优秀文章