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. # Vue3.5常用特性整理

    Vue3.5 发布已近半年,抽空整理下常用的新增/改动特性 响应式 Props 解构 Vue3.5 中 Props 正式支持解构了,并添加了响应式跟踪 设置默认值 使用 JavaScript 原生的默 ...

  2. .NET周刊【1月第2期 2025-01-12】

    国内文章 [.NET] API网关选择:YARP还是Ocelot? https://www.cnblogs.com/madtom/p/18655530 本文详细比较了YARP和Ocelot两种API网 ...

  3. LeetCode 第3题:无重复字符的最长子串

    LeetCode 第3题:无重复字符的最长子串 题目描述 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度. 难度 中等 题目链接 https://leetcode.cn/proble ...

  4. 1.6~THUWC 的总结

    THUWC 虽然拿到了一等奖,但是其实不如预期的发挥. Day1 获得 260~300 分.快速地想出了 T1T2 然后在调试上花费了很多的时间,T3 没有想出来,T4 想出了 \(O(n\log^3 ...

  5. 1. Docker 的简介概述

    1. Docker 的简介概述 @ 目录 1. Docker 的简介概述 2. Docker 的理念: 3. 容器与虚拟机比较 4. Docker应用场景 5. 最后: 为什么会有 Docker 出现 ...

  6. Linux安装Kafka(依赖zookeeper)

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

  7. What?废柴, 还在本地部署DeepSeek吗?Are you kidding?

    前言 DeepSeek推出更强大的推理模型DeepSeek R1后一发不可收拾,迅速火遍全球,用户暴增,但巨大的流量以及一些不可控因素,DeepSeek官网变得极不稳定,经常出现"网络繁忙& ...

  8. Postman 接口测试工具详解

    一.引言 在软件开发和测试过程中,接口测试是至关重要的环节.Postman 作为一款功能强大的接口测试工具,为开发者和测试人员提供了便捷高效的测试解决方案. 二.Postman 简介 Postman ...

  9. Netty - [01] 概述

    题记部分 一.介绍 Netty 是由JBOSS提供的一个Java开源框架,现为Github上的独立项目. Netty是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络I/O程 ...

  10. MySQL - [20] 事务

    题记部分 一.什么是ACID (1)Atomicity 原子性 某个操作,要么全部执行完毕,要么全部回滚. (2)Consistency 一致性 数据库中的数据全都符合现实世界中的约束,则这些数据就符 ...