聚簇索引与非聚簇索引
目录
在MySQL的InnoDB存储引擎中,聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)是两种不同的索引结构,它们在数据存储和检索方式上有显著的区别。
聚簇索引的定义及原理
-
定义:聚簇索引是指数据表中的数据存储按照索引的顺序排列。因此,索引的叶子节点存储的不仅是索引列的值,还存储整行数据。
-
原理:
- 聚簇索引整体是一个B+树结构。在这个结构中,非叶子节点存放的是键值,叶子节点存放的是行数据(也称为数据页)。
- 当定义了主键后,InnoDB会利用主键来生成其聚簇索引。如果没有主键,InnoDB会选择一个非空的唯一索引来创建聚簇索引;如果这也没有,InnoDB会隐式地创建一个自增的列来作为聚簇索引。
- 由于聚簇索引的叶子节点存储的是整行数据,因此通过聚簇索引进行查询时,可以直接从索引中找到所需的数据,而不需要额外的查找步骤。
非聚簇索引的定义及原理
-
定义:非聚簇索引是指索引和数据是分开存储的。非聚簇索引的叶子节点存储的是索引列的值和指向实际数据的指针(在InnoDB中,这个指针实际上是该行对应的主键值)。
-
原理:
- 非聚簇索引也是基于B+树实现的,但其叶子节点存储的是索引列的值和对应行的主键值,而不是直接存储数据。
- 通过非聚簇索引查询数据时,数据库首先需要使用非聚簇索引找到主键,然后再通过主键去聚簇索引中找到实际的数据。这个过程被称为“回表”。
- 一张表可以有多个非聚簇索引,每个索引都有自己的存储顺序和特性。
索引结构
非聚簇索引(Non-Clustered Index)在MySQL的InnoDB存储引擎中,通常是一个B+树结构。在这个结构中:
- 非叶子节点存储的是索引列的值和指向下一层节点的指针。
- 叶子节点存储的是索引列的值以及对应行的主键值(在InnoDB中,非聚簇索引的叶子节点不直接存储数据行,而是存储了指向数据行的主键值,这个主键值用于后续的回表操作)。
数据访问方式
非聚簇索引通过以下方式访问数据:
- 查找索引:当执行一个查询时,数据库首先会在非聚簇索引中查找与查询条件匹配的索引列的值。
- 获取主键:一旦在非聚簇索引中找到了匹配的索引列的值,数据库就会获取该值对应的主键值。
- 回表操作:最后,数据库会使用这个主键值去聚簇索引中查找对应的数据行。这个过程被称为“回表”。
查询处理流程
具体的查询处理流程如下:
- 接收查询请求:数据库接收到一个包含非聚簇索引列的查询请求。
- 查找非聚簇索引:数据库在非聚簇索引中查找与查询条件匹配的索引列的值。这一步通常很快,因为非聚簇索引的查找是基于B+树结构的,具有高效的查找性能。
- 获取主键并回表:一旦找到了匹配的索引列的值,数据库就会获取该值对应的主键值,并使用这个主键值去聚簇索引中查找对应的数据行。这一步可能相对较慢,因为需要额外的查找步骤。
- 返回查询结果:最后,数据库将查询到的数据行返回给客户端。
优点与局限性
非聚簇索引的优点包括:
- 可以加速对索引列的查找,特别是对那些经常作为查询条件的列。
- 一张表可以有多个非聚簇索引,可以根据不同的查询需求进行优化。
-
然而,非聚簇索引也有其局限性:
- 查询时需要通过索引列找到主键,然后再去聚簇索引查找实际数据,因此比直接使用聚簇索引略慢。
- 占用额外的存储空间,因为每个非聚簇索引都需要存储索引列的值和对应行的主键值。
聚簇索引与非聚簇索引的区别
-
数据存储方式:聚簇索引中,数据按照索引顺序存储;非聚簇索引中,索引和数据分开存储。
-
叶子节点内容:聚簇索引的叶子节点存储整行数据;非聚簇索引的叶子节点存储索引列的值和指向数据的指针(主键值)。
-
数量限制:每张表只能有一个聚簇索引(因为数据物理上只能有一种排列顺序);而一张表可以有多个非聚簇索引。
-
查询性能:
- 聚簇索引:由于数据存储在索引的叶子节点中,按主键或按聚簇索引进行查询非常快,特别是范围查询(如BETWEEN或ORDER BY)效率高。但插入和更新代价较高,因为需要维护索引的顺序。
- 非聚簇索引:可以加速对索引列的查找,尤其是对那些经常作为查询条件的列。但查询时需要通过索引列找到主键,然后再去聚簇索引查找实际数据,因此比直接使用聚簇索引略慢。不过,非聚簇索引具有更高的灵活性,因为一张表可以创建多个非聚簇索引来优化不同类型的查询。
原文地址:https://blog.csdn.net/cuishujian_2003/article/details/144332720
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!