MySQL 聚集索引与非聚集索引的概念以及优缺点

概念介绍:

聚集索引(Clustered Index)

  • 定义:聚集索引是一种数据存储方式,数据表中主键记录按照索引的顺序进行物理排序。每个表只能有一个聚集索引,因为数据物理上只能排序一次。
  • 实现:在 MySQL 中,InnoDB 存储引擎默认使用主键作为聚集索引。如果没有定义主键,InnoDB 会选择一个唯一的非空索引作为聚集索引。如果没有这样的索引,InnoDB 会隐式创建一个内部的行 ID 作为聚集索引。

非聚集索引(Non-Clustered Index)

  • 定义:非聚集索引是指索引的顺序与数据表中记录的物理存储顺序无关。每一个非聚集索引都有一个指向数据记录的指针。
  • 实现:在 MySQL 中,除聚集索引外的其他索引都是非聚集索引,包括唯一索引、普通索引和全文索引等。
示例:

假设有一个名为 employees 的表,其中包含 id(主键)、namedepartment 字段。

聚集索引

  • 如果 id 是主键,则 id 字段上的索引就是聚集索引,数据表会按 id 的顺序进行物理存储。
复制代码

sql复制代码

CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50) );

非聚集索引

  • 如果在 name 字段上创建索引,则 name 字段上的索引就是非聚集索引。
复制代码

sql复制代码

CREATE INDEX idx_name ON employees(name);

优缺点:

聚集索引的优缺点

优点

  1. 查询速度快:当查询条件中包含聚集索引的字段时,可以快速定位到数据记录,因为数据是按照索引顺序存储的。
  2. 范围查询高效:对聚集索引列进行范围查询时,物理上相邻的数据也相邻,减少了大量的 I/O 操作。
  3. 覆盖索引:如果所需查询列包含在聚集索引中,则可以直接从索引中获取数据,而不需要回表(访问数据表)。

缺点

  1. 插入速度慢:插入新记录时,可能需要将其他记录移动以维持物理顺序,导致插入性能降低。
  2. 更新和删除速度慢:更新聚集索引列的值,或删除记录时,需要维护物理顺序,可能会导致性能下降。
  3. 二级索引较大:由于聚集索引是基于数据表的物理存储顺序,所有非聚集索引的叶子节点都包含聚集索引的键值,因此非聚集索引可能会比较大。

非聚集索引的优缺点

优点

  1. 插入速度快:插入新记录时,不需要维护物理顺序,只需更新索引树即可,插入性能较好。
  2. 更新速度快:更新非聚集索引列的值时,不需要移动数据记录,只需更新索引树。
  3. 多重索引:一个表可以有多个非聚集索引,支持多种查询需求。

缺点

  1. 查询速度慢:当查询条件中包含非聚集索引字段时,首先通过索引定位到记录的指针,然后再访问数据表获取记录,称为回表操作。
  2. 范围查询低效:对非聚集索引列进行范围查询时,需要多次回表操作,性能较差。
  3. 索引占用空间大:非聚集索引包含指向数据记录的指针,索引结构可能会比较大,占用更多存储空间。

总结:

  • 聚集索引适用于频繁进行范围查询和排序的场景,查询性能高,但插入、更新和删除操作会影响性能。必须谨慎选择聚集索引列,通常会选择唯一且不频繁更新的列,如主键。
  • 非聚集索引适用于多种查询需求,支持快速定位记录,但由于回表操作,查询性能可能较低。适合需要多个索引支持快速查询的场景。

在实际使用中,需要根据具体业务需求和数据访问模式,合理选择和优化聚集索引和非聚集索引,以提升数据库的整体性能。

相关推荐
倔强的石头_16 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北2 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12024 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端