当前位置: 首页 > news >正文

介绍一下聚簇索引和非聚簇索引的定义和区别,以及优缺点?

 聚簇索引(Clustered Index) vs 非聚簇索引(Non-Clustered Index)

1.定义与核心区别

特性

聚簇索引

非聚簇索引

存储结构

索引的叶子节点直接存储数据行(数据即索引)

索引的叶子节点存储主键值(InnoDB)或数据行的物理地址(MyISAM)

数量限制

每张表只能有一个聚簇索引

每张表可以有多个非聚簇索引

默认行为

在InnoDB中,主键自动成为聚簇索引;若无主键,选唯一非空索引,否则隐式创建

用户手动创建的索引均为非聚簇索引

查询路径

直接通过索引定位到数据行

先通过索引找到主键或物理地址,再回表查询数据(InnoDB中称为“回表”)

2.性能对比

场景

聚簇索引

非聚簇索引

主键查询

⚡️ 极快(直接命中数据行)

➡️ 需回表,稍慢

范围查询

✅ 高效(数据连续存储)

❌ 需多次回表,效率低

插入/更新主键

⚠️ 代价高(可能导致数据重排序)

➡️ 不影响数据存储,仅更新索引

覆盖索引优化

✅ 天然覆盖(索引即数据)

✅ 若索引包含查询列,可避免回表

3.优缺点分析

索引类型

优点

缺点

聚簇索引

- 主键查询极快<br>- 范围查询高效(如BETWEEN、排序)<br>- 减少磁盘I/O

- 插入/更新主键时性能差(数据重组)<br>- 只能有一个,灵活性低

非聚簇索引

- 灵活创建多个索引<br>- 更新非主键列时开销小<br>- 适合高频查询非主键列

- 需回表,增加I/O<br>- 索引可能占用较大空间<br>- 范围查询效率低

4.InnoDB中的实现细节

1.非聚簇索引的回表机制

  • 非聚簇索引叶子节点存储主键值,查询时需要两步操作:

-- 例如:通过非聚簇索引`idx_name`查询`name='Alice'`的数据1.查`idx_name`索引,找到`name='Alice'`对应的主键值(如`id=100`)2.查聚簇索引,通过`id=100`定位到数据行

  • 若查询字段已包含在非聚簇索引中(覆盖索引),可避免回表:

-- 假设索引`idx_name_age`包含`(name, age)`SELECT age FROM users WHERE name='Alice';  -- 无需回表

2.隐式聚簇索引

  • 若表无主键,InnoDB会自动选择一个唯一非空索引作为聚簇索引;若没有,则隐式创建一个6字节的ROWID作为聚簇索引。

5.使用建议

场景

推荐索引类型

示例

主键查询(WHERE id=?)

聚簇索引(主键)

SELECT * FROM orders WHERE order_id=123

高频非主键列查询

非聚簇索引

CREATE INDEX idx_email ON users(email);

覆盖索引优化

联合非聚簇索引

CREATE INDEX idx_user_status ON orders(user_id, status);

频繁更新的列

慎用索引(维护成本高)

例如日志表中的last_updated字段,通常无需索引

6.示例对比

-- 表结构CREATE TABLE employees (

    id INT PRIMARY KEY,          -- 聚簇索引(数据按id排序存储)

    name VARCHAR(50),

    department_id INT,

    INDEX idx_department (department_id)  -- 非聚簇索引(叶子节点存储id)

);

-- 查询1:通过主键查询(聚簇索引)SELECT * FROM employees WHERE id = 100;  -- 直接定位数据行

-- 查询2:通过非聚簇索引查询SELECT * FROM employees WHERE department_id = 5;  -- 1.查idx_department找到department_id=5对应的id集合-- 2.回表查聚簇索引获取完整数据

7.总结

维度

聚簇索引

非聚簇索引

适用场景

主键查询、范围查询、排序

高频非主键列查询、覆盖索引优化

避坑指南

避免使用无序主键(如UUID),导致插入性能下降

避免过多索引,增加写操作开销

优化手段

利用覆盖索引减少回表

联合索引避免回表

选择原则:根据查询模式和数据分布,优先利用聚簇索引的高效性,非聚簇索引用于高频查询的辅助列,并通过覆盖索引减少回表开销。

 

相关文章:

  • 容器运行时详解
  • web3.0简介
  • 【EB-07】TC397 Tresos 导入通信ARXML
  • HTTP 协议的发展历程:从 HTTP/1.0 到 HTTP/2.0
  • 解码中国AI双雄突围:DeepSeek破壁与英伟达反攻背后的算力暗战
  • linux 内核dumpstack定位使用举例说明
  • 【基于Raft的KV共识算法】-序:Raft概述
  • AJAX 文件上传进度条 JAVA
  • 基于STM32的智能家居蓝牙系统(论文+源码)
  • uni-app 全局请求封装:支持 Promise,自动刷新 Token,解决 401 过期问题
  • 【框架】Spring、SpringBoot和SpringCloud区别
  • c++常用算法
  • 【Linux】消息队列和信号量
  • 深入理解Reactor Flux的生成方法
  • idea显示.java文件不能运行解决方式
  • Java 容器之 List
  • jenkens使用笔记
  • 探索Elasticsearch:认识与安装
  • 不谓侠--记录
  • Hive-08之数据仓库之建模、分析
  • 网站制作b s的基本步骤/自媒体运营主要做什么
  • 招聘网站竞品分析怎么做/百度一下你就知道官方
  • 微网站建设讯息/关键词优化价格表
  • 宠物网站建设规划书/企业网站的类型
  • 东莞凤岗疫情/seo公司哪家好用
  • 在线名片制作网站开发/seo优化seo外包