MySQL 覆盖索引

目录

一、什么是索引

二、索引的有哪些种类?

 三、InnoDB的不同的索引组织结构是怎样的呢?

四、什么是覆盖索引 

五、如何使用是覆盖索引?

六、如何确定数据库成功使用了覆盖索引呢

总结:


一、什么是索引

        索引(在 MySQL 中也叫“键key”)是存储引擎快速找到记录的一种数据结构,通俗来说类似书本的目录,这个比方虽然被用的最多但是也是最恰如其当的,在查询书本中的某个知识点不借助目录的情况下,往往都找的够呛,那么索引相较于数据库的重要性也可见一斑。

二、索引的有哪些种类?

        索引的种类这里只罗列出InnoDB支持的索引:主键索引(PRIMARY),普通索引(INDEX),唯一索引(UNIQUE),组合索引,总体划分为两类,主键索引也被称为聚簇索引(clustered index),其余都称呼为非主键索引也被称为二级索引(secondary index)。

 三、InnoDB的不同的索引组织结构是怎样的呢?

        众所周知在InnoDB引用的是B+树索引模型,这里对B+树结构暂时不做过多阐述,很多文章都有描述,在第二问中我们对索引的种类划分为两大类主键索引和非主键索引,那么问题就在于比较两种索引的区别了,我们这里建立一张学生表,其中包含字段id设置主键索引、name设置普通索引、age(无处理),并向数据库中插入4条数据:("小赵", 10)("小王", 11)("小李", 12)("小陈", 13)

CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',`name` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '名称',`age` int(3) unsigned NOT NULL DEFAULT '1' COMMENT '年龄',PRIMARY KEY (`id`),KEY `I_name` (`name`)
) ENGINE=InnoDB;INSERT INTO student (name, age) VALUES("小赵", 10),("小王", 11),("小李", 12),("小陈", 13);

这里我们设置了主键为自增,那么此时数据库里数据为

每一个索引在 InnoDB 里面对应一棵B+树,那么此时就存着两棵B+树。

可以发现区别在与叶子节点中,主键索引存储了整行数据,而非主键索引中存储的值为主键id, 在我们执行如下sql后

SELECT age FROM student WHERE name = '小李';

流程为:

  1. 在name索引树上找到名称为小李的节点 id为03
  2. 从id索引树上找到id为03的节点 获取所有数据
  3. 从数据中获取字段命为age的值返回 12 在流程中从非主键索引树搜索回到主键索引树搜索的过程称为:回表,在本次查询中因为查询结果只存在主键索引树中,我们必须回表才能查询到结果,那么如何优化这个过程呢?引入正文覆盖索引

四、什么是覆盖索引 

        覆盖索引(covering index ,或称为索引覆盖)即从非主键索引中就能查到的记录,而不需要查询主键索引中的记录,避免了回表的产生减少了树的搜索次数,显著提升性能。 

五、如何使用是覆盖索引?

        之前我们已经建立了表student,那么现在出现的业务需求中要求根据名称获取学生的年龄,并且该搜索场景非常频繁,那么先在我们删除掉之前以字段name建立的普通索引,以name和age两个字段建立联合索引,sql命令与建立后的索引树结构如下

ALTER TABLE student DROP INDEX I_name;
ALTER TABLE student ADD INDEX I_name_age(name, age);

 

那在我们再次执行如下sql后 

SELECT age FROM student WHERE name = '小李';

流程为:

  1. 在name,age联合索引树上找到名称为小李的节点
  2. 此时节点索引里包含信息age 直接返回 12

六、如何确定数据库成功使用了覆盖索引呢

        当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息 

        这里我们很清楚的看到Extra中Using index表明我们成功使用了覆盖索引 

总结:

        覆盖索引避免了回表现象的产生,从而减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是性能优化的一种手段,文章有不当之处,欢迎指正~

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

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

相关文章

Redis高级特性

文章目录 1.4.1 Redis的缓存过期淘汰策略1.4.1.1 Redis内存满了怎么办1.4.1.2 过期策略1.4.1.3 缓存淘汰策略1.4.1.3.1 Redis 中LRU设计1.4.1.3.2 Redis 中LFU设计 1.4.2 持久化机制1.4.2.1 持久化流程1.4.2.2 RDB1.4.2.3 AOF1.4.2.3.1 AOF运行原理1.4.2.3.2 AOF文件重写原理 1…

Vue自定义指令校验按钮权限

目标 在类似运营平台的项目中,经常会有一些操作按钮需要校验当前登录的用户是否有权限访问。然而在每一个按钮上都加 v-if 判断非常的繁琐和冗余,为此可以通过自定义指令的方式来处理按钮权限 实现方案 在main.js全局添加自定义指令 // 权限列表&…

PowerBI商业智能分析引入,带你了解什么是商务智能

一、商务智能工具 什么是Power BI ?Power Bl是微软开发的一个软件,它是从获取数据、数据清洗、数据图表搭建、数据分析、共享发布为一体的软件,无论你的数据是简单的Excel电子表格,还是复杂庞大的数据库,Power Bl都可…

智慧文旅:提升旅游体验与推动经济发展的新动力

一、智慧文旅的定义与意义 智慧文旅,即智慧文化旅游,是一种以当地特色文化元素为核心驱动,利用现代科技手段实现旅游景区全面智慧升级的旅游模式。其意义在于为游客提供高效便捷的旅游信息化服务,提升旅游体验,同时推…

使用 OpenAI 自定义 API 提高电商平台的推荐精度

使用 OpenAI 自定义 API 提高电商平台的推荐精度 一、引言 随着人工智能技术的不断发展,推荐系统在电商领域的应用越来越广泛。电商平台通过推荐系统向用户提供个性化的商品推荐,从而提高用户满意度和转化率。OpenAI 提供了自定义 API,使得…

用vue写表格实现数量的加减

可以使用Vue的v-model和计算属性来实现表格中数量的加减功能。 首先,在Vue实例中定义一个数组items,数组中包含多个对象,每个对象代表表格中的一行数据,包含一个quantity属性来表示数量。例如: new Vue({el: #app,da…

Go语言基础之单元测试

1.go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go …

【Linux】Linux权限的概念 -- 详解

一、Linux 中的用户 Linux 下有两种用户: 超级用户(root):可以在 Linux 系统下做任何事情,不受限制。普通用户:在 Linux 下做有限的事情。 超级用户的命令提示符是 “#”,普通用户的命令提示符…

解读BEVFormer,新一代自动驾驶视觉工作的基石

文章出处 BEVFormer这篇文章很有划时代的意义,改变了许多视觉领域工作的pipeline[2203.17270] BEVFormer: Learning Birds-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers (arxiv.org)https://arxiv.org/abs/2203.17270 BEV …

ESP8266 控制之 : 使用 RingBuffer USART1 和 USART3互传

简介 使用Buffer来避免数据的丢失, 或许你自己在使用串口进行收发时会丢失数据, 现在我们就来简单使用一下RingBuffer创建Rx、Tx的Buffer来避免发送接收丢包或数据丢失问题。 扩展知识 RingBuffer的介绍, 看完大概也就知道了,实在不知道就看看下面的代码 线路连接…

实习记录——第五天

今天我的心情不是很美丽,昨天晚上没怎么睡好,因为我一直在想离不离开实验室?该怎么说的事情?但是又觉得这个项目还没有完全结束,冒昧提这个事情是不是不好?最终也没得出一个结论,晚上睡得也不踏…

Redis++源码学习1

为了更好使用Redis库,分析了源码,了解了命令的发送过程及连接池管理细节等。草草做了笔记留存。 创建ConnectionOptions 创建ConnectionPoolOptions 创建redis(ConnectionOptions, ConnectionPoolOptions) 执行redis.auth() 调用Redis::command 模板函…

使用antdesign3.0、echarts制作固定资产后台管理系统原型

学了半个月Axure,周末用半天时间,照着网上的模板做了一个固定资产后台管理系统的原型。重点是内联框架的使用,和对echarts表格js代码的调试。原型链接:https://qoz5rv.axshare.com 资产管理系统

代码随想录算法训练61 | 总结篇

前面60天的刷题大概是按照如下类型来刷:数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->单调栈。每道题目都是精心筛选,都是经典题目高频面试题。并且,每个专题开始都有理论基础篇&#xff…

gitignore规则

在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交。 Git 忽略文件提交的方法 有三种方法可以实现忽略Git中不想提交的文…

SD NAND的CLK引脚的注意事项和走线规范

CLK的作用和注意事项 SD NAND的时钟引脚(CLK)的作用是提供一个时钟信号,用于同步数据传输。时钟信号是由主设备(如微控制器或存储控制器)提供的,用于确保SD NAND和主设备之间的数据交换是按照相同的时序进…

AcWing--因数平方和-->数论,整数分块

4662. 因数平方和 - AcWing题库&#xff08;python) # 输入 n int(input()) mod int(1e9 7) # 求平方和 def square_sum(n): return n * (n 1) * (2 * n 1) // 6 % mod # 结果 res 0 i1 while(i<n): # 找到开始跟结尾 x n // i y n // x res (res …

SQL Server我用TRUNCATE TABLE 表名称 清除表,没有释放空间,怎么才能把我刚才TRUNCATE TABLE 清表的空间给释放掉

在 SQL Server 中&#xff0c;当你使用 TRUNCATE TABLE 命令时&#xff0c;它确实会删除表中的所有数据&#xff0c;但不会回收空间。这是因为 TRUNCATE 操作保留了表的结构、索引、触发器等&#xff0c;而仅仅删除数据页。 如果你想释放由 TRUNCATE 操作保留的空间&#xff0…

力扣hot100 子集 回溯 超简洁

Problem: 78. 子集 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) Code class Solution {List<Li…

SpringBoot 相关概念

文章目录 SpringBoot事务的使用Spring Boot 有哪几种读取配置的方式&#xff1f;SpringBoot的自动配置原理是什么bootstrap.properties 和 application.properties 有何区别 ?什么是 Spring Profiles&#xff1f;Spring Boot 中如何解决跨域问题 ?SpringBoot性能如何优化实现…