🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客
🔥温馨提示:划到文末发现专栏彩蛋 点击这里直接传送
🔥本篇概览:详细讲解了MySQL中聚簇索引、非聚簇索引、覆盖索引的区别🌈⭕🔥
【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】
🌈序言:
从0到1完完整整学习一遍MySQL语言,记住了,你学JAVA就要把他相关的所有知识都系统的学一学,后而习之,这样才算说有认真去对待这门语言。
🌈引出:
明确概念:
一、聚簇索引
- 定义:是一种对磁盘上实际数据的物理储存顺序重新组织以按指定的一个或多个列的值排序的索引方式。也就是说,索引的叶子节点存储的就是数据行,数据行和索引存储在一起。
- 特点:
- 数据的物理存储顺序与索引顺序一致,因此可以根据索引值快速定位到数据。
- 一个表只能有一个聚簇索引,因为数据的物理存储只能有一种顺序。
- 插入新数据时,可能会导致数据的移动,因此插入操作的开销可能较大。
- 示例:如果一个表有一个主键,并且没有指定非聚簇索引为主键,那么通常主键会自动创建为聚簇索引。例如,一个学生信息表,以学生的学号为主键,并且创建了聚簇索引,那么数据在磁盘上就会按照学号的顺序进行存储。(敲重点——直接落盘到磁盘了)
二、非聚簇索引
- 定义:非聚簇索引也称为非聚集索引,它的索引结构和数据是分开存储的,索引的叶子节点存储的是指向数据行的指针。
- 特点:
- 数据的物理存储顺序与索引顺序无关。
- 一个表可以有多个非聚簇索引。(指向主键的指针可以有多个)
- 插入新数据时,通常不会影响非聚簇索引的结构,因此插入操作相对较快。
- 示例:还是以学生信息表为例,如果除了主键学号外,还为学生的姓名创建了一个非聚簇索引,那么索引的叶子节点存储的是指向学生数据行的指针,通过这个指针可以找到对应的学生数据,而数据在磁盘上的存储顺序仍然是按照聚簇索引(如果有)或者插入的顺序。
三、覆盖索引
- 定义:覆盖索引是一种特殊的索引,它是指一个索引包含了查询中所需要的所有列的数据,这样就不需要再回表查询数据行,直接从索引中就可以获取到所有需要的数据。
- 特点:
- 可以大大提高查询性能,减少磁盘 I/O 操作。
- 只适用于某些特定的查询场景,即查询的列都在索引中包含。
- 示例:假设有一个订单表,包含订单号、客户 ID、订单日期、订单金额等字段,创建了一个包含订单号、订单日期和订单金额的联合索引。如果有一个查询只需要订单号、订单日期和订单金额这三个字段的值,那么这个联合索引就可以作为覆盖索引,直接从索引中获取数据,而不需要再访问表中的数据行。(innodb底层优化)
三者区别:
覆盖索引和聚簇索引与非聚簇索引关系其实都没有,它唯一的要点就是查询所需要的信息已经在查询的列中全部显示了,而这个列呢,它也已经创建了索引,那么它就可以被认为是覆盖索引。
而至于聚簇索引和非聚簇索引的话,它们是根据主键的区别来进行定位的可能会发生回表查询,但是覆盖索引一旦确认了,它就不会发生回表查询,不管是不是主键,它直接根据 Innodb 引擎进行优化,直接定位到所需要的行。
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏推荐
🌈🌈JAVA基础要夯牢 关注走一波💕💕
🌈🌈JAVA后端技术栈 关注走一波💕💕
🌈🌈JAVA面试八股文 关注走一波💕💕
🌈🌈代码随想录精讲200题 关注走一波💕💕
🌈🌈JAVA项目(含源码深度剖析) 关注走一波💕💕
🌈🌈计算机四件套 关注走一波💕💕
🌈🌈必知必会工具集 关注走一波💕💕
🌈🌈书籍网课笔记汇总 关注走一波💕💕
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!