高薪Offer收割机之聚集索引和非聚集索引

news2024/10/7 6:41:44

什么是聚集索引,非聚集索引,回表查询,覆盖索引

聚集索引就是将数据存储与索引放到了一起,索引结构的叶子节点保存了行数据,一张表必须有且只有一个聚集索引。

如果存在主键,主键就是聚集索引,如果不存在主键将使用第一个唯一索引作为聚集索引,如果既没有主键又找不到合适的唯一索引则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

非聚集索引将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键,可以存在多个。

5966ea891b6b27c2cccf8e497bdd2ae8.jpeg

例如:在表中的主键id字段上建立聚集索引,name字段上建立非聚集索引(二级索引)

8d955f2557d7f48db8edc6c559df2bfa.jpeg

从上图可以看出聚集索引的叶子节点除了存储主键id的值以外还存储了行中的数据,只要定位到叶子节点就可以读出表中的任意数据。而非聚集索引的叶子节点存储的是主键id的值,在非聚集索引上定位到叶子节点以后只能得到主键id的值,如果想得到整行的值还需要在聚集索引上查找主键id的值。这就是回表查询。

那么什么是覆盖索引呢?

覆盖索引指的是查询使用了索引,并且需要返回的列在该索引中已经全部都能找到。

比如下面这张表:

19a209ba709e100cd05affd3ba84ef12.jpeg

id为主键默认主键索引为聚集索引,在name字段上建立非聚集索引。

执行sql语句:select * from tb_user where id = 2

会在主键索引上查询id=2的数据,定位到叶子节点以后可以查询出所有的数据。在索引中就包含了需要查询的所有数据,因此是覆盖索引。

c4c8cdee5fc743f7c89500276f41ddbf.jpeg

再来看一个sql语句:select id,name from tb_user where name = ‘Arm’

查询name为Arm的id和name这里用到了name上的非聚集索引,查询的id和name其中id为主键,name为索引列,都在该索引中,因此是覆盖索引。

776ea92ebab80cd57e3b4a6a4f1cac11.jpeg

再看一个sql语句:select id,name,gender from tb_user where name = ‘Arm’

这里在name的非聚集索引上要查询id,name,gender三个列的值。其中id,name在索引中包含,gender不在索引中需要通过回表查询,因此不是覆盖索引。

18d6612bea59df6ec51374d5c2836096.jpeg

覆盖索引可以用来缓解超大分页的查询效率问题。

在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低

我们来看看limit分页查询耗时对比

Select * from stu limit 0,10

这条sql语句耗时0.00 sec

Select * from stu limit 9000000,10

这条sql语句耗时11.05 sec

为什么第二条sql语句比第一条sql语句耗时长了这么多呢?因为第二条sql语句需要对前9000010条数据进行排序只需要返回第9000000到900010的记录,其他记录丢弃,查询排序的代价非常大。

怎么样去优化呢?

可以通过覆盖索引加子查询来提高性能。

看下面的sql语句:

select *from stu t,
(select id from tb_sku order by id limit 9000000,10) a
where t.id = a.id;

该sql语句执行耗时7.13 sec性能明显提升

在子查询中使用了覆盖索引查询9000000到900010的id然后再和stu表关联查询。查询出其他字段内容。

另外我精心编写了两百道java面试题,攘括了java基础,数据库,java高级,多线程,jvm,ssm,spring cloud等内容的高频面试题,需要的私信“java面试题”


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/846564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

180天,小卡拉米 - 编程路线,学习计划!

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 职业生涯这条路,我在前面10年开的路,将让你少走很多弯路👣! 工作了这么多年&…

Nginx开启gzip网页传输压缩配置

场景 Nginx 服务器为网页压缩专门提供了 gz 模块,并且模块中的相关指令均可以设置在http、server或location块中, 实现服务器端按照指定的设置进行压缩。 CentOS7中解压tar包的方式安装Nginx: CentOS7中解压tar包的方式安装Nginx_centos7…

ospf减少LSA更新

实验及实验要求 一、思路 1.根据区域划分IP地址 2.使公网可通---写缺省 3.使R3成为MGRE中心站点,R5、R6、R7为分支站点 4.一个个去配置ospf区域和RIP区域,确保每个区域配置无误 5.区域0要更改OSPF在接口的工作类型为broadcast ,并使R3为…

WDM设备栈

图 1一块USB主控制器卡(主控芯片为VIA VL805) 图中的板卡包含USB主控制器(USB Host Controller)、USB集线器(USB Hub),这里USB集线器扩展了4个USB端口(USB Port)。 PCI…

智慧工地源码:数字孪生智慧工地可视化解决方案

一、智慧工地建设背景 我国经济发展正从传统粗放式的高速增长阶段,进入高效率、低成本、可持续的中高速增长阶段。随着现代建筑的复杂度和体量等不断增加,施工现场管理的内容越来越多,管理的技术难度和要求在不断提高。传统的施工现场管理模…

C++ 测试框架 GoogleTest 初学者入门篇 丙

断言 什么是断言?断言是用来对表达式执行比较的代码块,调用时类似函数。当表达式一致时,断言返回成功,否则失败。 googletest 的断言是一组宏定义。分为 ASSERT_* 和 EXPECT_* 两种。 比如 ASSERT_EQ(1, 2);EXPECT_EQ(1, 2);上…

Element-UI简介

目录 安装 常用组件 Container 布局容器 Button 按钮 MessageBox 弹框 Form 表单验证 element-ui是一个前端的ui框架,封装了很多已经写好的ui组件,例如表单组件,布局组件,表格组件.......是一套桌面端组件。 Element - 网站…

JAVA SpringBoot 项目 多线程、线程池的使用。

1.1 线程: 线程就是进程中的单个顺序控制流,也可以理解成是一条执行路径 单线程:一个进程中包含一个顺序控制流(一条执行路径) 多线程:一个进程中包含多个顺序控制流(多条执行路径&#xff0…

斗轮机无线控制系统技改方案

一、应用背景 马钢的前身是成立于1953年的马鞍山铁厂,2019年马钢集团正式成为中国宝武控股子公司。马钢产品以建筑用型线材为主,满足重型工业厂房、轻钢结构、高层建筑、桥梁结构、工业管道等构件的加工需要。目前马钢在岗员工4.8万人,具备了…

采用模块化方式编译

一、前言 比如:uImage下有很多驱动文件,但是驱动开发时,要频繁更改驱动文件,如果每次编译整个uImage编译会浪费时间,所以引入模块化方式编译,把驱动设置为模块化编译,这样每次更改或重新编译时…

v4l2-ctl 命令查看 RK3568 上的摄像头节点

使用 v4l2-ctl 命令查看 RK3568 上的摄像头节点,可以按照以下步骤进行操作: 首先,请确保您的 RK3568 设备上已经安装了 v4l-utils 工具包。如果没有安装,可以使用以下命令进行安装: $ sudo apt-get install v4l-utils打…

【HMS Core】Health Kit 血压、血糖等数据返回数据包含max,min,avg,last 数据,这些数据的含义是什么意思?

【问题描述】 1. 血压、血糖等数据返回数据包含max,min,avg,last 数据,这些数据的含义是什么意思? 2. 如何获取用户上传健康数据的腕表的型号 【解决方案】 1、血压原子采样统计数据类型开放的是多日统计查询接口,统计的维度是按…

FinClip 支持小程序维度域名配置;桌面端体验活动进行中

FinClip 的使命是使您(业务专家和开发人员)能够通过小程序解决关键业务流程挑战,并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点,看看是否有助于您实现目标。 产品方面的相关动向👇&#x1f…

APT60DQ20BG-ASEMI快恢复二极管APT60DQ20BG

编辑:ll APT60DQ20BG-ASEMI快恢复二极管APT60DQ20BG 型号:APT60DQ20BG 品牌:ASEMI 封装:TO-3P 恢复时间:≤35ns 正向电流:60A 反向耐压:200V 芯片个数:双芯片 引脚数量&…

Python实现GA遗传算法优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世…

Jmeter(四) - 从入门到精通 - 创建网络测试计划(详解教程)

1.简介 在本节中,您将学习如何创建基本的 测试计划来测试网站。您将创建五个用户,这些用户将请求发送到JMeter网站上的两个页面。另外,您将告诉用户两次运行测试。因此,请求总数为(5个用户)x(2…

网络安全进阶学习第十四课——MSSQL注入

文章目录 一、MSsql数据库二、MSsql结构三、MSsql重点表1、master 数据库中的Sysdatabases 表2、Sysobjects 表3、Syscolumns 表 四、Mssql常用函数五、Mssql的报错注入六、Mssql的盲注常用以下函数进行盲注: 七、联合注入1、获取当前表的列数2、获取当前数据库名3、…

汽配企业MES管理系统具体有哪些功能

随着全球汽车产业的不断升级,汽配市场竞争日趋激烈。为了在激烈的市场竞争中获得优势,汽配制造企业必须加快转型升级,向精益生产和精益管理方向前进。而车间信息化管理是实现精益化生产的基础。 汽配行业的生产管理面临着诸多挑战&#xff0…

SDUT 2023 summer team contest(for 22) - 12

A - Todays Word 题意:就是给你一个字符串S0,让你输出的后m位是什么, 思路:我们知道SnSn-1的前一半Sn-1next(Sn-1的后一半的后一位,z的后一位是a),next是求其下一位(z的下一位是a)&…

01《Detecting Software Attacks on Embedded IoT Devices》随笔

2023.08.05 今天读的是一篇博士论文 论文传送门:Detecting Software Attacks on Embedded IoT Devices 看了很长时间,发现有一百多页,没看完,没看到怎么实现的。 摘要 联网设备的增加使得嵌入式设备成为各种网络攻击的诱人目标&…