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

什么是聚簇索引、非聚簇索引、回表查询

        其实聚集索引也叫聚簇索引,二级索引也叫非聚簇索引,大家不要认为这是不同的两个知识点。

定义

        先看一下数据库的索引介绍。

        1d2249c9d201430eb1140b2a87dbc417.png

 聚簇索引

  1. 如果存在主键(一般都存在),主键索引就是聚簇索引。

  2. 如果不存在,就用唯一索引(UNIQUE)做聚簇索引。

  3. 如果表没有主键,也没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚簇索引。


 总而言之,一张表肯定是存在一个聚簇索引的 ,并且只能有一个,非叶子节点存储索引,叶子节点存储行数据。

        假设一张表叫user,有如下三个字段

1fefc446130d4aadbdc1d5443cf82b8b.png

下面就是聚簇索引的结构图。

68ac5571da3744149f54a4fce14a57bd.png

非聚簇索引

        非聚簇索引存储的内容是主键,所以,我们根据非聚簇索引查询数据的时候,底层是可能会查两次的,这里我们给name字段加上非聚簇索引。

查两次情况: 执行select * from user where name = ’kit‘。

        第一次:  根据非聚簇索引‘kit’查到对应数据的主键

        第二次: 根据主键,也就是聚簇索引查询对应的行数据返回

查一次情况: 执行select  id from user where name  = 'kit'

第一次:  根据非聚簇索引‘kit’查到对应数据的主键,直接返回。

c4be56011af648a29e317115811790f6.png

         可能文字有些难以理解,现在根据上面两张图片和下面一张图片来看个例子,表名为‘user’,这里id是主键,自然对应聚簇索引,如果我们根据id 查询数据,例如select * from user where id = 5; 此时就会在聚簇索引中查询这一行数据直接返回。 现在我们给name加个非聚簇索引,现在根据name查询数据,select * from user where name = ”kit“,此时会根据非聚簇索引name查到对应的id为5,再根据id聚簇索引查询行数据返回。

1fefc446130d4aadbdc1d5443cf82b8b.png

回表查询

       其实你已经见过回表查询了,你先看看概念,

        回表查询是数据库中常见的一个概念,指的是当数据库引擎无法直接从索引中获取所需数据,而需要回到原始数据表中进行额外的查找操作。这种情况通常发生在查询语句中包含了索引无法覆盖的字段或者涉及到了复杂的查询条件时。回表查询会对数据库的性能产生不利影响,因为它需要更多的IO操作和数据扫描,导致查询速度变慢。

       再看看非聚集索引的需要查两次的情况,这就是回表查询,回表查询查一次是不够的,要查多张表。

http://www.lryc.cn/news/492231.html

相关文章:

  • 探索 Spring 框架核心组件:构建强大 Java 应用的基石
  • Android 13 Aosp 默认允许应用动态权限
  • 【C++知识总结1】c++第一篇,简单了解一下命名空间是什么
  • 从0开始深度学习(32)——循环神经网络的从零开始实现
  • GitLab使用操作v1.0
  • cuda conda yolov11 环境搭建
  • 解决SpringBoot连接Websocket报:请求路径 404 No static resource websocket.
  • element-plus的组件数据配置化封装 - table
  • 【二维动态规划:交错字符串】
  • goframe开发一个企业网站 MongoDB 完整工具包18
  • 在vue中,根据后端接口返回的文件流实现word文件弹窗预览
  • 动态规划之背包问题
  • 【Python】 深入理解Python的单元测试:用unittest和pytest进行测试驱动开发
  • Java集合1.0
  • Leetcode 336 回文对
  • 实现一个可配置的TCP设备模拟器,支持交互和解析配置
  • 算法的空间复杂度
  • 自定义协议
  • 在 Taro 中实现系统主题适配:亮/暗模式
  • autogen框架中使用chatglm4模型实现react
  • 读《Effective Java》笔记 - 条目9
  • 【软件入门】Git快速入门
  • nextjs window is not defined
  • C语言实现冒泡排序:从基础到优化全解析
  • windows11下git与 openssl要注意的问题
  • lua除法bug
  • Ubuntu下Docker容器java服务往mysql插入中文数据乱码
  • C语言根据字符串变量获取/设置结构体成员值
  • Selenium 自动化测试demo
  • LeetCode 111.二叉树的最小深度