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. stdio.h的缓冲机制解析

    1. 令人迷惑的printf() 在C语言中,由于stdio.h中的缓冲机制,printf的输出通常会受到缓冲区的影响. 这种影响可能非常微妙,并常常令人疑惑,比如我们来看下面这段代码 #includ ...

  2. 爬虫基础知识及scrapy框架使用和基本原理

    爬虫 一.异步IO 线程:线程是计算机中工作的最小单元 ​ IO请求(IO密集型)时多线程更好,计算密集型进程并发最好,IO请求不涉及CPU 自定义线程池 进程:进程默认有主线程,可以有多线程共存,并 ...

  3. jenkins全局工具配置

  4. Asp.Net Core3.0 微信小程序统一下单

    微信统一下单开发文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1 微信支付小程序支付文档:https://pay.wei ...

  5. Deepseek学习随笔(9)--- 清华大学发布Deepseek赋能职场(附网盘链接)

    作为一名职场人,在工作中常常面临效率瓶颈:如何快速生成高质量内容?如何高效处理复杂任务?这些问题在接触了<清华大学-DeepSeek赋能职场>这份文档后,得到了全新的解答.这份由清华大学新 ...

  6. Javascript Object对象转Map

    1. Object对象 const data = { "banana": [ { "color": "yellow", "coun ...

  7. 螺旋原型设计 (Spiral Model SDLC)

    螺旋模型介绍 -:该模型描述了软件开发过程.该模型是两种模型的组合,首先是迭代模型和一个SDLC 模型,并将其与循环过程相结合. 该模型考虑了大多数其他模型通常没有注意到的风险.该模型从在一次迭代开始 ...

  8. Typecho 博客文章评论添加显示 UserAgent(UA)的功能

    本篇文章实现了为 Typecho 博客文章评论添加显示 UserAgent(UA)的功能 本功能可替代 UserAgent 插件,更美观.简洁且好看 效果显示 大概就是这样了,实际效果请看我的评论! ...

  9. 如何让N1盒子、机顶盒开机从优盘启动进入刷机流程

    疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 准备阶段 1.下载我的从优盘启动的工具包 2.确认你 ...

  10. Processing中获取表格数据( .tsv\.csv )的经验分享

    在日常收集数据的需求中,会有很多场合用到表格数据类型,如.tsv和.csv,一来高效查看和编辑,二来数据条理清晰,导入数据结构方便.在Prcocessing中帮我预留好了loadTable().loa ...