自学内容网 自学内容网

聚簇索引与非聚簇索引

目录

聚簇索引的定义及原理

非聚簇索引的定义及原理

索引结构

数据访问方式

查询处理流程

优点与局限性

聚簇索引与非聚簇索引的区别


在MySQL的InnoDB存储引擎中,聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)是两种不同的索引结构,它们在数据存储和检索方式上有显著的区别。

聚簇索引的定义及原理

  1. 定义:聚簇索引是指数据表中的数据存储按照索引的顺序排列。因此,索引的叶子节点存储的不仅是索引列的值,还存储整行数据。

  2. 原理

    • 聚簇索引整体是一个B+树结构。在这个结构中,非叶子节点存放的是键值,叶子节点存放的是行数据(也称为数据页)。
    • 当定义了主键后,InnoDB会利用主键来生成其聚簇索引。如果没有主键,InnoDB会选择一个非空的唯一索引来创建聚簇索引;如果这也没有,InnoDB会隐式地创建一个自增的列来作为聚簇索引。
    • 由于聚簇索引的叶子节点存储的是整行数据,因此通过聚簇索引进行查询时,可以直接从索引中找到所需的数据,而不需要额外的查找步骤。

非聚簇索引的定义及原理

  1. 定义:非聚簇索引是指索引和数据是分开存储的。非聚簇索引的叶子节点存储的是索引列的值和指向实际数据的指针(在InnoDB中,这个指针实际上是该行对应的主键值)。

  2. 原理

    • 非聚簇索引也是基于B+树实现的,但其叶子节点存储的是索引列的值和对应行的主键值,而不是直接存储数据。
    • 通过非聚簇索引查询数据时,数据库首先需要使用非聚簇索引找到主键,然后再通过主键去聚簇索引中找到实际的数据。这个过程被称为“回表”。
    • 一张表可以有多个非聚簇索引,每个索引都有自己的存储顺序和特性。
索引结构

非聚簇索引(Non-Clustered Index)在MySQL的InnoDB存储引擎中,通常是一个B+树结构。在这个结构中:

  • 非叶子节点存储的是索引列的值和指向下一层节点的指针。
  • 叶子节点存储的是索引列的值以及对应行的主键值(在InnoDB中,非聚簇索引的叶子节点不直接存储数据行,而是存储了指向数据行的主键值,这个主键值用于后续的回表操作)。
数据访问方式

非聚簇索引通过以下方式访问数据:

  • 查找索引:当执行一个查询时,数据库首先会在非聚簇索引中查找与查询条件匹配的索引列的值。
  • 获取主键:一旦在非聚簇索引中找到了匹配的索引列的值,数据库就会获取该值对应的主键值。
  • 回表操作:最后,数据库会使用这个主键值去聚簇索引中查找对应的数据行。这个过程被称为“回表”。
查询处理流程

具体的查询处理流程如下:

  • 接收查询请求:数据库接收到一个包含非聚簇索引列的查询请求。
  • 查找非聚簇索引:数据库在非聚簇索引中查找与查询条件匹配的索引列的值。这一步通常很快,因为非聚簇索引的查找是基于B+树结构的,具有高效的查找性能。
  • 获取主键并回表:一旦找到了匹配的索引列的值,数据库就会获取该值对应的主键值,并使用这个主键值去聚簇索引中查找对应的数据行。这一步可能相对较慢,因为需要额外的查找步骤。
  • 返回查询结果:最后,数据库将查询到的数据行返回给客户端。
优点与局限性

非聚簇索引的优点包括:

  • 可以加速对索引列的查找,特别是对那些经常作为查询条件的列。
  • 一张表可以有多个非聚簇索引,可以根据不同的查询需求进行优化。
  • 然而,非聚簇索引也有其局限性:

  • 查询时需要通过索引列找到主键,然后再去聚簇索引查找实际数据,因此比直接使用聚簇索引略慢。
  • 占用额外的存储空间,因为每个非聚簇索引都需要存储索引列的值和对应行的主键值。

聚簇索引与非聚簇索引的区别

  1. 数据存储方式:聚簇索引中,数据按照索引顺序存储;非聚簇索引中,索引和数据分开存储。

  2. 叶子节点内容:聚簇索引的叶子节点存储整行数据;非聚簇索引的叶子节点存储索引列的值和指向数据的指针(主键值)。

  3. 数量限制:每张表只能有一个聚簇索引(因为数据物理上只能有一种排列顺序);而一张表可以有多个非聚簇索引。

  4. 查询性能

    • 聚簇索引:由于数据存储在索引的叶子节点中,按主键或按聚簇索引进行查询非常快,特别是范围查询(如BETWEEN或ORDER BY)效率高。但插入和更新代价较高,因为需要维护索引的顺序。
    • 非聚簇索引:可以加速对索引列的查找,尤其是对那些经常作为查询条件的列。但查询时需要通过索引列找到主键,然后再去聚簇索引查找实际数据,因此比直接使用聚簇索引略慢。不过,非聚簇索引具有更高的灵活性,因为一张表可以创建多个非聚簇索引来优化不同类型的查询。

原文地址:https://blog.csdn.net/cuishujian_2003/article/details/144332720

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!