MySQL InnoDB 引擎中的聚簇索引和非聚簇索引的区别

在 MySQL 的 InnoDB 存储引擎中,聚簇索引和非聚簇索引是两种常见的索引类型,它们在数据存储结构和使用场景上有显著区别。


1. 聚簇索引(Clustered Index)

特点

  1. 数据和索引存储在一起

    • InnoDB 表的主键索引是聚簇索引,数据行存储在叶子节点中。
    • 索引按照主键值排序,数据行的存储顺序与索引顺序一致。
  2. 一个表只能有一个聚簇索引

    • 因为表的数据行只能存储一次,因此只能根据一个索引进行聚簇。
  3. 高效范围查询

    • 聚簇索引适合范围查询,因为数据是物理上连续存储的。
  4. 回表操作减少

    • 查询主键索引时,无需再次从其他位置读取数据行。

缺点

  1. 主键过大影响性能

    • 主键列较长会导致索引占用更多空间,降低性能。
  2. 插入速度受排序影响

    • 新数据插入时需要维护顺序,可能引发页分裂,导致性能下降。

存储结构

  • 以 B+ 树为基础构建,叶子节点存储的是完整的数据行。

2. 非聚簇索引(Secondary Index)

特点

  1. 数据和索引分开存储

    • 索引的叶子节点存储的是主键值而非完整的数据行。
  2. 支持多个非聚簇索引

    • 一个表可以有多个非聚簇索引。
  3. 查询时需要回表

    • 查询非聚簇索引时,通过主键值回到聚簇索引查找完整数据行。

优点

  1. 支持更多的查询优化

    • 可以为需要频繁查询的非主键列建立索引。
  2. 灵活性高

    • 多个非聚簇索引可以覆盖不同的查询场景。

缺点

  1. 查询可能较慢

    • 需要通过主键值回表查找完整数据行,增加查询时间。
  2. 占用更多存储空间

    • 每个非聚簇索引都需要单独的存储空间。

存储结构

  • 以 B+ 树为基础构建,叶子节点存储的是主键值。

3. 聚簇索引与非聚簇索引的对比

对比项 聚簇索引 非聚簇索引
存储结构 数据行存储在叶子节点 叶子节点存储主键值
数据顺序 数据按主键顺序存储 数据存储与索引无关
支持数量 每个表只能有一个 一个表可以有多个
回表操作 不需要 查询完整数据时需要回表
空间占用 较少 较多
查询效率 主键查询和范围查询更高效 需要回表时效率较低
适用场景 主键查询、范围查询 查询非主键列

4. 总结

  • 聚簇索引

    • 将数据和索引存储在一起,查询主键效率高,但插入性能可能受影响。
    • 适合对主键频繁查询或排序的场景。
  • 非聚簇索引

    • 数据和索引分开存储,支持灵活的查询优化,但需要回表查找数据。
    • 适合对非主键列频繁查询的场景。

在设计表时,需要根据查询需求合理选择索引类型,以优化查询性能。

MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?的更多相关文章

  1. MySQL中Innodb的聚簇索引和非聚簇索引

    聚簇索引 数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种.Innodb的聚簇索引在同一个B-Tree中保存了索引列和具体的数据,在聚簇索引中,实际的数据保存在叶子页中, ...

  2. MYSQL性能调优: 对聚簇索引和非聚簇索引的认识

    聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理&g ...

  3. MySQL 聚簇索引和非聚簇索引的认识

    聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理&g ...

  4. mysql索引总结(3)-MySQL聚簇索引和非聚簇索引

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  5. mysql索引总结(2)-MySQL聚簇索引和非聚簇索引

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  6. mysql 聚簇索引、非聚簇索引的区别

    索引分为聚簇索引和非聚簇索引. 以一本英文课本为例,要找第8课,直接翻书,若先翻到第5课,则往后翻,再翻到第10课,则又往前翻.这本书本身就是一个索引,即"聚簇索引". 如果要找& ...

  7. mysql索引之聚簇索引与非聚簇索引

    1 数据结构及算法基础 1.1 索引的本质 官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构 本质:索引是数据结构 查询是数据库的最主要功能之一.我们都希望查询速度能尽可能快,因此数 ...

  8. 【Mysql优化】聚簇索引与非聚簇索引概念

    必须为主键字段创建一个索引,这个索引就是所谓的"主索引".主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE.  首先明白两句话: innod ...

  9. 一分钟明白MySQL聚簇索引和非聚簇索引

    MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储的是主键值,这是了解聚簇索引和非聚簇索引的前提 什么是聚簇索引? 很简单记住一 ...

  10. 巧用MySQL InnoDB引擎锁机制解决死锁问题(转)

    该文会通过一个实际例子中的死锁问题的解决过程,进一步解释innodb的行锁机制 最近,在项目开发过程中,碰到了数据库死锁问题,在解决问题的过程中,笔者对MySQL InnoDB引擎锁机制的理解逐步加深 ...

随机推荐

  1. uni-app无法触发onReachBottom事件

    我们经常会遇见列表; 但是今天却发现下拉的时候: 无法触发onReachBottom事件; 原来是因为列表内容嵌套出现问题: 导致onReachBottom事件无法被触发 记住:列表内容如果是组件:外 ...

  2. Schreier–Sims 算法

    好看的实现. #include<bits/stdc++.h> using namespace std; #define int long long const int maxn=105; ...

  3. Linux安装Kafka(依赖zookeeper)

    一.版本 kafka:kafka_2.12-2.4.0 zk:zookeeper-3.4.14 二.单机版安装 修改 server.properties ,支持外网访问 [1]创建日志文件夹: mkd ...

  4. P3092 [USACO13NOV] No Change G 题解

    传送门 题解 思路 看到 \(1\le k\le16\),我们想到状压DP. 以每枚硬币是否被使用为状态,对其进行枚举. 令 \(dp_i\) 表示状态 \(i\) 下最多能支付到第 \(dp_i\) ...

  5. flutter-应用版本更新dialog

    https://www.cnblogs.com/upwgh/p/13367589.html

  6. 基于Trae开发的自动表关联查询工具

    对于复杂的一些业务,会涉及很多张表,其间有各种各样的关联关系,在开发&测试过程中,随时需要查看这些表中的数据状态,这种情况下需要我们写一些关联查询的SQL或者多条SQL执行来查看结果,个人感觉 ...

  7. 中国最难入职的IT公司排行榜

    在IT行业竞争日益白热化的今天,头部企业的招聘门槛不断刷新求职者的认知.根据最新行业调研和招聘数据,我们整理出2025年中国最难入职的几家互联网公司,并揭秘其背后严苛的选拔逻辑. 通常衡量难不难,会从 ...

  8. [JXOI2017] 加法 题解

    最小值最大,考虑二分答案,问题转为判断最小值是否能 \(\ge x\). 假如 \(a_i\ge x\),那我们肯定不管:假如 \(a_i<x\),那最好能让选择的区间 \(r\) 值更大,用优 ...

  9. 特征转换之python代码

    一.连续型变量1.1 连续变量无量纲化(1)无量纲化: 使不同规格尺度的数据转化统一规格尺度(将数据单位统一)(2)无量纲化方法:标准化, 区间所方法 标准化: 将连续性变量转变为 均值0 标准差1 ...

  10. 如何在 PIP 配置文件中设置默认源?

    在不同的操作系统中,在 PIP 配置文件中设置默认源的方法如下: Windows 操作系统 打开文件资源管理器,在地址栏输入 %APPDATA% 并回车,进入用户配置目录. 在该目录下创建一个名为 p ...