mysql 第5.4章 索引-主键索引和非主键索引的区别 mysql 第5.4章 索引-主键索引和非主键索引的区别

1天前

在 MySQL 中,主键索引和非主键索引(普通索引)都是用于提高查询效率的机制,但它们有不同的特性和用途。

聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)是数据库管理系统中两种不同的索引类型,它们在数据的物理存储方式、查询效率、使用场景等方面都有显著的区别。

以下是它们的主要区别:

一、主键索引(Primary Key Index)

定义:主键索引是一种特殊的索引,它在表中唯一标识每一行数据。每个表只能有一个主键索引。

特性:

  • 唯一性:主键索引要求主键列的值必须唯一,不能为 NULL,因为表的数据只能以一种物理顺序存储。

  • 存储结构:聚簇索引的叶子节点包含实际的数据行,而不是指向数据行的指针。这意味着通过聚簇索引查找数据时,不需要再进行额外的回表操作。

  • 自动创建:当你创建表时,如果定义了主键,MySQL 会自动创建主键索引。

  • 聚集索引:InnoDB 存储引擎中的主键索引通常是聚集索引(Clustered Index)。这意味着表的数据实际上是按主键的顺序存储在磁盘上的。其他索引会包含主键值作为其键的一部分。

  • 聚簇索引:是一种将表中的数据行与索引按顺序存储的索引类型。在一个表中,数据的物理存储顺序与聚簇索引的键值顺序相同。

  • 效率:由于主键索引是唯一的,因此在查找、插入和删除操作时具有很高的效率。

  • 查询性能:对于范围查询(如 BETWEEN、<、>)、排序操作,以及需要读取连续数据的查询,聚簇索引性能较高,因为数据物理上是连续存储的。

使用场景:

  • 用于唯一标识表中的每一行数据。

  • 常用于需要唯一性约束的列,如用户 ID、订单号等。

  • 适用于频繁进行排序操作或范围查询的列,例如日期字段、自动递增的主键字段等。

  • 在 MySQL 的 InnoDB 存储引擎中,主键通常被默认用作聚簇索引。

示例:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

二、非主键索引(普通索引)

定义:非主键索引是指除了主键索引之外的所有索引。它们用于加速对表的查询操作,但不具有主键索引的唯一性要求。

特性:

  • 非唯一性:非主键索引的列值可以重复,也可以为 NULL(除非显式指定 UNIQUE 约束)。

  • 非聚集索引:在 InnoDB 存储引擎中,非主键索引是非聚集索引(Secondary Index)。非主键索引存储的是索引列的值和主键值的组合。数据的实际存储是按主键排序的,非主键索引会通过主键来访问数据。

  • 非聚簇索引:是一种独立于数据存储顺序的索引类型。非聚簇索引的叶子节点存储的是指向数据行的指针,而不是实际的数据行。

  • 灵活性:可以在表中创建多个非主键索引,用于加速不同的查询条件。

  • 多个索引:一个表可以有多个非聚簇索引,因为这些索引不会影响数据的物理存储顺序。

  • 存储结构:非聚簇索引的叶子节点包含索引键值和指向对应数据行的指针。这意味着通过非聚簇索引查找数据时,可能需要通过指针进行额外的回表操作来获取实际数据。

  • 查询性能:非聚簇索引在精确查找(如查找某个具体值)时性能较好,但对于需要大量回表的查询,性能可能不如聚簇索引。

使用场景:

  • 用于提高特定查询条件的性能,如频繁用于 WHERE 子句中的列。

  • 适用于需要快速查找特定值的列,例如用户名、邮箱、唯一标识符等。

  • 可以在需要多个查询条件时使用多个非聚簇索引。

  • 当需要根据非主键列快速查找数据时使用。

示例:

CREATE INDEX idx_name ON users (name);

三、主要区别总结

数据存储:

  • 聚簇索引:数据按索引键的顺序存储,叶子节点包含实际数据。

  • 非聚簇索引:数据存储顺序独立于索引,叶子节点包含指向数据的指针。

  • 主键索引直接决定了表的数据存储顺序(对于 InnoDB),而非主键索引则通过主键值访问数据。

唯一性:

  • 主键索引要求唯一性,非主键索引不要求唯一性。

数量:

  • 每个表只能有一个主键索引,但可以有多个非主键索引。

  • 聚簇索引:一个表只能有一个。

  • 非聚簇索引:一个表可以有多个。

查询性能:

  • 聚簇索引:适合范围查询、排序操作,因为数据物理上是连续存储的。

  • 非聚簇索引:适合精确查找,但对于范围查询和需要回表的操作性能较差。

空间开销:

  • 聚簇索引:由于数据按索引存储,不需要额外的指针存储,节省空间。

  • 非聚簇索引:需要额外存储指针,空间开销更大。

索引类型:

  • 主键索引通常是聚集索引,而非主键索引通常是非聚集索引。

总结:

  • 主键索引和非主键索引各有其独特的作用和适用场景。在设计数据库表时,需要根据具体的查询需求和数据特性选择合适的索引策略。

  • 聚簇索引:数据和索引是合二为一的,适合那些需要排序和范围查询的场景。

  • 非聚簇索引:数据和索引分离,适合快速精确查找的场景,可以创建多个,提供灵活的查询优化手段。

阅读 22

mysql文章
带到手机上看