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

总结:

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

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

相关推荐
ThisIsClark20 分钟前
【后端面试总结】MySQL主从复制逻辑的技术介绍
mysql·面试·职场和发展
Mr.131 小时前
数据库的三范式是什么?
数据库
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Python之栈1 小时前
【无标题】
数据库·python·mysql
风_流沙1 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
亽仒凣凣1 小时前
Windows安装Redis图文教程
数据库·windows·redis
亦世凡华、2 小时前
MySQL--》如何在MySQL中打造高效优化索引
数据库·经验分享·mysql·索引·性能分析
YashanDB2 小时前
【YashanDB知识库】Mybatis-Plus调用YashanDB怎么设置分页
数据库·yashandb·崖山数据库
ProtonBase2 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
云和数据.ChenGuang7 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite