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. 索引占用空间大:非聚集索引包含指向数据记录的指针,索引结构可能会比较大,占用更多存储空间。

总结:

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

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

相关推荐
lansye12 分钟前
MySQL K8S日志分析与数据还原
mysql·k8s
lang2015092826 分钟前
MySQL 8.0原子性DDL全面解析
数据库·mysql
viperrrrrrrrrr71 小时前
milvus向量数据库
数据库·大模型·llm·milvus
白衣鸽子1 小时前
MySql数据库同步技术:构建高可用架构的基石
数据库·后端
不良人天码星2 小时前
redis的事务,以及watch的原理
数据库·redis·缓存
韩立学长2 小时前
基于微信小程序的公益捐赠安全平台9hp4t247 包含完整开发套件(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·微信小程序·小程序
智能化咨询2 小时前
SQL之参数类型讲解——从基础类型到动态查询的核心逻辑
数据库·oracle
doris82042 小时前
使用Yum安装Redis
数据库·redis·缓存
有一个好名字2 小时前
万字 Apache ShardingSphere 完全指南:从分库分表到分布式数据库生态
数据库·分布式·apache
Boilermaker19922 小时前
【Redis】哨兵与对脑裂的情况分析
数据库·redis·缓存