索引—聚簇索引与非聚簇索引

概述

按照体系结构索引可以划分为聚簇索引和非聚簇索引。聚簇索引是数据页中行的顺序与索引页中行的顺序相一致的一种索引。这就是为什么一个表中只能存在一个聚簇索引,而非聚簇索引却可以有很多个。在一些数据库系统中,聚簇索引的叶子节点对应实际数据,没有一个指向其他地方的数据指针。

聚簇索引与非聚簇索引的索引结构中都只包含键与记录的标识符。记录标识符总是指向数据页中的行。对于聚簇索引,数据库会按照索引页中键的顺序来保存数据页中的数据。数据库将相似键的行插入到同一页中。如果表被重组,数据会按照索引键的顺序插入到数据页中。而非聚簇索引中,数据库不会维护任何数据的顺序,也就是说,不会保证索引页中的键的顺序与数据页中的数据顺序是一致的。

聚簇索引可以提升大多数查询操作的性能,因为它提供了更线性的数据访问路径。

聚簇索引的创建

由于不同的数据库引擎对于它的定义会有不同。我们用MySQL的InnoDB引擎为例。

每一个InnoDB表都有一个特殊的索引称为聚簇索引,用于存储行数据。通常,聚簇索引等同于主键。

1、在表上定义主键,InnoDB会将其作为聚簇索引来使用。每一张表都应该定义主键。如果没有逻辑上唯一并且非空的列用于定义主键,可以添加自动增长的列。自动增长列会在插入一个新行时自动增加一个唯一的值。

2、如果一张表中没有主键,InnoDB会使用第一个定义为非空的唯一索引为聚簇索引。该列必须定义唯一索引且非空,同时满足时才可以。

# 将表users中的id列定义为唯一索引列
create unique index cluster_index on users(id);
# 修改id列添加非空约束
alter table users
modify column id int not null;

3、如果表中没有主键或者合适的唯一索引,InnoDB会在包含行ID的合成列上生成一个叫GEN_CLUST_INDEX隐藏聚簇索引。这些行是通过InnoDB分配的行ID进行排序的。行ID是6个字节的字段,随着新行的插入而递增。这些行是通过行ID按插入的物理顺序排序的。

二级索引与聚簇索引的关系

聚簇索引以外的其他索引都称为二级索引。在InnoDB中,二级索引中的每一条记录都包含该行的主键列以及二级索引指定的列。InnoDB使用主键的值搜索聚簇索引中的行。

如果主键过长,二级索引会占用更多空间,所以建议使用短一点的主键。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注