MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引是什么

MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引是什么
最新回答
遗心遗梦遗快乐

2023-12-07 22:49:48

MySQL中的索引类型及特性如下

聚簇索引
聚簇索引是一种数据存储方式,其叶子节点直接保存完整的记录行数据(包含所有列信息)。在InnoDB引擎中,每张表必须有且仅有一个聚簇索引,默认基于主键构建。若未定义主键,InnoDB会依次选择非空的唯一索引列、非空列或隐藏的DB_ROW_ID作为聚簇索引。由于数据行与索引结构紧密绑定,聚簇索引的查询效率极高,但插入、更新操作可能因数据物理排序调整产生额外开销。

非聚簇索引
非聚簇索引(辅助索引)的叶子节点仅存储索引列值和主键ID,不包含完整记录。查询时需通过主键回表到聚簇索引中获取完整数据,这一过程称为“回表”。例如,以age字段创建的非聚簇索引,查询SELECT * FROM user WHERE age=10需两次索引查询:先通过age索引定位主键ID,再通过聚簇索引获取整行数据。若仅需主键或索引列本身(如SELECT id FROM user WHERE age=10),则无需回表,此时非聚簇索引升级为覆盖索引。

联合索引
联合索引是对多列组合创建的索引,其叶子节点同时存储所有索引列的值及主键ID,并按多列字典序排序。使用联合索引需遵循最左前缀匹配原则:查询条件必须从索引的第一列开始连续匹配。例如,对(name, age)创建的联合索引,WHERE name='张三' AND age=20可利用索引,而WHERE age=20则无法使用。此外,联合索引支持索引下推优化(MySQL 5.6+):在索引遍历时提前过滤不符合条件的记录,减少回表次数。例如,查询WHERE name='张三' AND age=20时,先通过联合索引筛选name='张三'且age=20的记录,再回表获取数据,避免无效回表。

唯一索引
唯一索引强制要求索引列的值唯一(允许NULL值重复),系统在数据插入或更新时自动检查重复值。主键索引是特殊的唯一索引,既保证唯一性又作为聚簇索引。唯一索引适用于需要确保数据唯一性的场景(如用户名、邮箱字段),但会降低插入效率(需校验唯一性)。