WordPress文章批量生成器/优化seo教程技术
文章目录
- MySQL 索引
- 索引分类
- 索引创建和删除
- 索引的执行过程
- explain 查看执行计划
- explain 结果字段分析
- 索引的底层实现原理
- B-树
- B+树
- 哈希索引
- 聚集和非聚集索引
- MyISAM(\*.MYD,*.MYI)
- 主键索引
- 辅助索引(二级索引)
- InnoDB(*.IBD)
- 主键索引
- 辅助索引(二级索引)
- 自适应哈希索引
MySQL 索引
当表中的数据量到达几十万甚至上百万的时候,SQL查询所花费的时间会很长,导致业务超时出错,此时就需要用索引来加速SQL查询。
由于索引也是需要存储成索引文件的,因此对索引的使用也会涉及到磁盘I/O操作。如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL的查询效率,适得其反,因此需要掌握良好的索引创建原则!
索引分类
索引是创建在表上的,是对数据库表中的一列或者多列的值进行排序的一种结果。索引的核心是提高查询的速度!
物理上(聚集索引 & 非聚集索引)/ 逻辑上(…)
索引的优缺点:
优点:提高查询效率
缺点:索引并非越多越好,过多的索引会导致CPU使用率居高不下,由于数据的改变,会造成索引文件的改动,过多的磁盘I/O会造成CPU负荷太重
- 普通索引:没有任何限制条件,可以给任何类型的字段创建普通索引(创建新表 & 已创建表,数量是不限的,一张表的一次SQL查询只能用一个索引 where a = 1 and b = ‘M’)
- 唯一性索引:使用 UNIQUE 修饰的字段,值不能够重复,主键索引就隶属于唯一性索引
- 主键索引:使用 PRIMARY KEY 修饰的字段会自动创建索引(MyISAM、InnoDB)
- 单列索引:在一个字段上创建索引
- 多列索引:在表的多个字段上创建索引(uid + cid,多列索引必须使用到第一列,才能够用到多列索引,否则索引用不上)
- 全文索引:使用 FULLTEXT 参数可以设置全文索引,只支持 CHAR、VARCHAR、TEXT 类型的字段上,常用于数据量较大的字符串类型上,可以提高查询速度(线上项目支持专门的搜索功能,给后台服务器增加专门的搜索引擎支持快速高效的搜索 elesticsearch 简称 es;C++开源的搜索引擎;搜狗的workflow)
索引创建和删除
- 创建表的时候指定索引字段
CREATE TABLE index1(id INT,name VARCHAR(20),sex ENUM('male', 'female'),INDEX(id, name),INDEX `index name` (sex) # 没有名字,会默认会生成# show create table 进行查看创建SQL语句
)# Create Table: CREATE TABLE `student` (
# `uid` int unsigned NOT NULL AUTO_INCREMENT,
# `name` varchar(50) NOT NULL,
# `age` tinyint unsigned NOT NULL,
# `sex` enum('M','W') NOT NULL,
# PRIMARY KEY (`uid`),
# KEY `nameidx` (`name`)
#) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 #COLLATE=utf8mb4_0900_ai_ci
- 在已经创建的表上添加索引
CREATE [UNIQUE] INDEX 索引名 ON 表明 (属性名 (length) [ASC | DESC]);# create index nameidx on student(name); // 默认btree索引# 添加 hash 索引
# create index ageidx on studetn(age) using hash;
- 删除索引
DROP INDEX 索引名 ON 表名;
- 查看所有索引
show indexes from 表明;
1、经常作为 where 条件过滤的字段考虑添加索引
2、字符串列创建索引时,尽量规定索引的长度,而不能让索引值的长度 key_len 过长
3、索引字段涉及类型强转、mysql函数调用、表达式计算等,索引就用不上了(索引失效)
索引的执行过程
explain 查看执行计划
使用explain查看SQL的执行计划,分析索引的执行过程,mysql的user权限示例如下:
可以看到使用了主键索引,共扫描了1行,Using index 表示直接从索引树上查询到结果,不需要回表
- 由于Host和User设立了联合索引,也就是多列索引,而多列索引只有第一列的索引使用了,才能进行索引查询,不然不会进行索引查询
explain 结果字段分析
-
select_type
simple:表示不需要union操作或者不包含子查询的简单select语句。有连接查询时,外层的查询为simple且只有一个
primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary且只有一个
union:union连接的两个select查询,除了第一个表外,第二个以后的表的select_type都是union
union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null
-
table
显示查询的表明;
如果不涉及对数据库的操作,这里就显示null
如果显示为尖括号就表示这是个临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生的
如果是尖括号括起来<union M, N>也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集
-
type
const:使用唯一索引或者主键,返回记录一定是1行已经的等值where条件时,通常type就是const
ref:常见于辅助索引的等值查找,或者多列主键,唯一索引中,使用第一个列之外的列作为等值查找会出现;返回数据不唯一的等值查找也会出现
range:索引范围扫描,常见于使用<,>,is null,between,in,like等运算符的查询中
index:索引全表扫描,把索引从头到尾扫一遍;常见于使用索引列就可以处理不需要读取数据文件的查询,可以使用索引排序或者分组的查询
all:全表扫描数据文件,然后在server层进行过滤返回符合要求的记录
-
ref
如果使用常数等值查询,这里显示const
如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段
-
Extra
- using filesort:排序时无法用到索引,常见于 order by 和 group by 语句中
- using index:查询时不需要回表查询,直接通过索引就可以获取查询的数据
索引的底层实现原理
数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘块(对应索引树的节点),索引树越低,越”矮胖“,磁盘I/O次数就越少
MySQL支持两种索引,一种是B-树索引,一种是哈希索引,两者在数据查询的效率是非常高的
主要对于InnoDB存储引擎进行讨论,基于B-树的索引结构(MySQL实际采用的是B+树结构)
B-树
B-树是一种m阶平衡树(一般来说m=300~500),叶子节点都在同一层,由于每一个节点存储的数据量比较大,索引整个B-树的层数是比较低的,基本上不超时三层。
二分查找:时间复杂度O(logn)
由于磁盘的读取也是按block块操作的(内存是按page页面操作的),因此B-树的节点大小一般设置为和磁盘块大小一致,这样一个B-树节点,就可以通过一次磁盘I/O把一个磁盘块的数据全部存储下来,所以当使用B-树存储索引的时候,磁盘I/O的操作次数是最少的(MySQL的读写效率,主要集中在磁盘I/O上)
select * from student where uid = 5(uid添加了索引);
uid 有索引 ==> 存储引擎 ==> kernel(操作系统) > 磁盘I/O(读索引文件)> 内存上 ==> 用索引的数据构建B-树加速搜索
一次磁盘I/O读取的磁盘块的内容,刚好存储在B树的一个节点中
因为非叶子节点都有左右子树,所以指针域 = 数据域 + 1
假设有2000W条数据,用AVL存储2000W条数据,构建下来有25层(计算器以log10为底,所以得这么除)
如果 m = 500,最多三层,也就是最多花费三次的磁盘I/O,大大减少了速率
扩展:B-树的缺点
- 每个节点中有key,也有data,但是每一个节点的存储空间是有限的,如果data数据较大时会导致每个节点能存储的key的数据很小
- 当存储的数据量很大时同样会导致B-树的高度较大,磁盘I/O次数花费增大,导致效率降低
面试考点:为什么MySQL(MyISAM和InnoDB)索引底层采用B+树,而不是B-树?
1、索引 + 数据内容分散在不同的节点上,离根节点近的,搜索就快;离根节点远的,搜索就慢!
2、每一个非叶子节点上,不仅仅要存储索引(key),还要存储索引值所在的那一行的data数据。一个节点所能存放的索引key的个数,比只存储key值的节点的个数要少得多。(例如,索引key要存4个字节,对应data数据也要4个字节,那就是8个字节,每一块数据,但是如果只存索引key,那就可以存两个,数据最后去叶子节点上找)
3、这棵树不方便做范围搜索,整表遍历看起来也不方便
例如:where age > 11 and age < 18,相当于17的左右子树都要去查,然后12的左右子树也要去查。很不方便(看上图)
因此由于以上的三个原因 ==> MySQL采用B+树来构建索引树
B+树
一句话:B+树最后其实就是一个循环链表,串起来了,所以说最后的查询就是在循环链表中进行查询
特点:
- 每一个非叶子几点,只存放索引key,不存放数据data,好处就是一个节点存放的索引key更多,B+树在理论上来说,层数会更低一些,搜索的效率会更好一些
- 叶子节点上存储了所有的索引值(数据data),搜索每一个索引对应的值data,都需要在叶子节点上,这样子每一行记录搜索的时间是平均的
- 叶子节点被串在一个链表当中,形成一个有序的链表,如果要进行索引树的搜索&整表搜索,直接遍历叶子节点的有序链表即可!或者做范围查询的时候,直接遍历叶子节点的有序链表即可
面试考点:B-树和B+树在存储结构上有什么不同?
1、B-树的非叶子节点,存了索引key和对应的数据地址,而B+树的非叶子节点只存了索引key,不存数据data,因此B+树的每一个非叶子节点存储的关键字是远远多于B-树的,因此,从树的高度上来说,B+树的高度要小于B-树,使用的磁盘I/O次数少,因此查询的会快一些
2、B-树由于每个节点都存储了索引key和对应的数据,因此离根节点近的数据,查询的就快,离根节点远的数据,查询的就慢;而B+树所有的数据都存储在叶子节点上,因此在B+树上搜索索引key,找到对应数据的时间是比较平均的,没有快慢之分
3、在B-树上如果做区间查找,遍历的节点是非常多的;B+树所有的叶子节点被连结成了有序链表结构,因此做整表遍历和区间查找是非常容易的
哈希索引
哈希索引由哈希表实现的,哈希表对数据并不排序,因此不适合做区间查找,效率非常低,需要搜索整个哈希表结构
时间复杂度O(1),链式哈希表
优点:搜索的效率更好、磁盘I/O花费要少
hash(name) = hashkey % bucket_num (哈希冲突)
哈希表中的元素没有任何顺序可言!只能进行等值比较
select * from student where name = 'zhangsan';select * from student where name like 'zhang%'; error
- 范围搜索,前缀搜索,order by 排序这些操作,哈希索引都不适合!!!
- 它没办法处理磁盘上的数据,加载到内存上构建高效的搜索数据结构,因为它没有办法减少磁盘I/O的次数
聚集和非聚集索引
MyISAM(*.MYD,*.MYI)
select * from student where name = 'zhangsan';
没有索引:直接会在整张表中进行全查(整表搜索)
有索引:进行*.MYI的索引文件的查询,生成B树,然后进行二分查找
主键索引
- MyISAM引擎使用B+树作为索引结构,叶节点的data域存放的是数据记录的地址(通过这个地址去查找数据data)。
- 即主键对应的data是数据的地址(具体的数据都需要去寻址,在一个data数据表中)
辅助索引(二级索引)
- 在MyISAM中,主键索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯 一的,而辅助索引的key可以重复,如果给其它字段创建辅助索引,结构图如下:
总结:MyISAM存储引擎,索引结构叶子节点存储关键字和数据地址,也就是说索引关键字和数据 没有在一起存放,体现在磁盘上,就是索引在一个文件存储,数据在另一个文件存储,例如一个user 表,会在磁盘上存储三个文件 user.frm(表结构文件) user.MYD(表的数据文件) user.MYI(表的索引文件)。
MyISAM的索引方式也叫做非聚集索引
InnoDB(*.IBD)
- InnoDB存储引擎的索引关键字和数据是存放在一起的
select * from student where name = 'zhangsan';
没有索引:会自动生成B树
有索引:会根据索引数据生成一张新的B树
主键索引
- uid 是主键
- 主键索引树:
- 每个索引下面对应的是对应的数据(例如:15 => 34 Bob)
辅助索引(二级索引)
- InnoDB的辅助索引,叶子节点上存放的是索引关键字和对应的主键(即如果要获取数据,需要通过主键进行回表查询主键索引树,进行获取到数据)
select * from student where name = 'Alice';
1、先搜索name的二级索引树,找到Alice对应的主键uid=18
2、再拿uid=18回表在书简索引树搜索uid那一行记录
问题:select * from student where age = 20 order by name;如果只给age添加索引,行不行?还有什么没有考虑到?
不行,如果只有age键索引,会有using filesort!,因此需要创建age、name的多列索引
先按照age进行排序,再按照name进行排序;age相同,按name进行排序
总结:辅助索引的B+树,先根据关键字找到对应的主键,再去主键索引树上找到对应的行记录数据。从索引树上可以看到,InnoDB的索引关键字和数据都是在一起存放的,体现在磁盘存储上,例如创建一个user 表,在磁盘上只存储两种文件,user.frm(存储表的结构),user.ibd(存储索引和数据)。
InnoDB的索引树叶节点包含了完整的数据记录,这种索引叫做聚集索引。
两者的区别:MyISAM比InnoDB多了磁盘I/O的使用,它需要读取*.MYI文件获取索引数据,进行生成B树(相当于多了一部I/O操作,两个文件)
自适应哈希索引
InnoDB存储引擎监测到同样的二级索引不断被使用;那么它会根据这个二级索引,在内存上根据二级索引树(B+树)上的二级索引值,在内存上构建一个哈希索引,来进行加索引搜索
- 自适应哈希索引本身的数据维护也是要耗费性能的,并不是说自适应哈希索引在任何情况下都会提升二级索引的查询性能!我们需要根据参数指标,来具体分析是否打开或者关闭自适应哈希索引
show engine innodb status\G1、RW-latch等待的线程数量(自适应哈希索引默认分配了8个分区),同一个分区等待的线程数量过多
2、走自适应哈希索引的频率(低)和二级索引树搜索的频率(高)
面试考点:SQL和索引的优化问题
通过explain分析SQL
项目 ==> 业务 ==> 千条、万条SQL
流程:从什么地方能够获取哪些运行时间长,耗性能的SQL,然后再通过explain去分析它
相关文章:

MySQL面试篇章——MySQL索引
文章目录 MySQL 索引索引分类索引创建和删除索引的执行过程explain 查看执行计划explain 结果字段分析 索引的底层实现原理B-树B树哈希索引 聚集和非聚集索引MyISAM(\*.MYD,*.MYI)主键索引辅助索引(二级索引) InnoDB&a…...

WSL 2 Oracle Linux 9.1 安装配置
文章目录 环境使用体验安装 Oracle Linux 9.1修改默认存储路径默认 root 用户登录启用 systemd启用 SSH 连接WSL 无法 ping 通宿主机和域名WSL 使用主机代理(测试通过)WSL 常用命令 环境 OS:Win11 24H2 (OS 内部版本26120.1252) wsl --versio…...

MySQL日志文件详解
MySQL中的日志文件是MySQL数据库系统的重要组成部分,它们记录了数据库的运行情况、用户操作、错误信息等,对于数据库的维护、优化、故障排查和恢复都具有重要意义。以下是MySQL中几种主要日志文件的详解: 1. 二进制日志(Binary L…...

MySQL零散拾遗(三)
在mysql中,JOIN ON 和 WHERE 的作用和用法是怎么样的? 在MySQL中,JOIN语句用于将两个或多个表根据指定的关联条件合并成一个新的结果集。JOIN ON和WHERE子句在JOIN语句中扮演着不同的角色,它们的用法和作用如下: JOI…...

鸿蒙 使用 Refresh 实现下拉刷新
import promptAction from ohos.promptActionEntry Component struct Index {Staterefreshing: boolean falseStatelist: number[] Array(20).fill(Date.now())Buildercontent(){Stack(){Row(){LoadingProgress().height(32)Text(正在刷新...).fontSize(16).margin({left:20}…...

【JavaScript 算法】图的遍历:理解图的结构
🔥 个人主页:空白诗 文章目录 一、深度优先搜索(DFS)深度优先搜索的步骤深度优先搜索的JavaScript实现 二、广度优先搜索(BFS)广度优先搜索的步骤 三、应用场景四、总结 图的遍历是图论中的基本操作之一&am…...

Ubuntu 中默认的 root 用户密码
场景:想要切换root用户,发现得输入密码,以为是以前设置过然后一直尝试都是错误【认证失败】最后发现根本没设置过root用户,默认会随机生成root用户的密码😅 Ubuntu 中默认的 root 密码是随机的,即每次开机都…...

Rust编程-高级特性
unsafe:内存不安全 内存安全问题,例如空指针解引用 关键字unsafe来切换到不安全模式,并在被标记后的代码块中使用不安全代码 使用unsafe告诉编译器后面代码安全性自行负责 因为电脑硬件安全问题,必须编写可能不安全的代码 可以将…...

JavaRegexImprove练习(1) (2024.7.22)
ImproveExercise1 package RegexImprove20240722; import java.util.Scanner; public class ImproveExercise {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串");String str sc.nextLine();//…...

基于YOLO模型的鸟类识别系统
鸟类识别在生物研究和保护中具有重要意义。本文将详细介绍如何使用YOLO(You Only Look Once)模型构建一个鸟类识别系统,包括UI界面、YOLOv8/v7/v6/v5代码以及训练数据集。 目录 2. 环境配置 2.1 安装Python和相关库 2.2 安装YOLO模型库 …...

WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)
文章目录 1.媒体协商SDP简介 2.网络协商STUN的工作原理TURN工作原理 3.信令服务器信令服务器的主要功能信令服务器的实现方式 1.媒体协商 比如下面这个例子 A端与B端要想通信 A端视频采用VP8做解码,然后发送给B端,B端怎么解码? B端视频采用…...

面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux
1. 如果系统的 QPS 突然提升 10 倍该怎么设计? 1.1 硬件的扩展微服务的拆分 如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法…...

【数学建模】——前沿图与网络模型:新时代算法解析与应用
目录 1.图与网络的基本概念 1. 无向图和有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与图的连通性 2.图的矩阵表示 1. 关联矩阵 2. 邻接矩阵 3.最短路问题 1.Dijkstra 算法 2.Floyd 算法 4.最小生成树问题 1.Kruskal 算法 2.Prim 算法 5.着色问题 6.…...

视频分帧【截取图片】(YOLO目标检测【生成数据集】)
高效率制作数据集【按这个流程走,速度很顶】 本次制作,1059张图片【马路上流动车辆】 几乎就是全自动了,只要视频拍得好,YOLO辅助制作数据集就效率极高 视频中的图片抽取: 【由于视频内存过大,遇到报错执行…...

Redis7(二)Redis持久化双雄
持久化之RDB RDB的持久化方式是在指定时间间隔,执行数据集的时间点快照。也就是在指定的时间间隔将内存中的数据集快照写入磁盘,也就是Snapshot内存快照,它恢复时再将硬盘快照文件直接读回到内存里面。 RDB保存的是dump.rdb文件。 自动触发…...

发布支持TS的npm包
你现在有这么一个包,已经将他发布在npm上了,周下载量也还比较可观。美中不足的就是,这个包之前使用js写的,现在你想增加TS类型,提升用户使用体验,那么你现在可以做以下几个步骤 1.在你的包的根目录下创建一…...

计算机视觉9 全卷积网络
全卷积网络(Fully Convolutional Network,简称 FCN)在计算机视觉领域具有重要地位。 传统的卷积神经网络(CNN)在最后的输出层通常使用全连接层来进行分类任务。然而,全连接层会丢失空间信息,使得…...

02.C++入门基础(下)
1.函数重载 C支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。 1、参数类型不同 2、参数个数不同…...

【数据结构】探索排序的奥秘
若有不懂地方,可查阅我之前文章哦! 个人主页:小八哥向前冲~_csdn博客 所属专栏:数据结构_专栏 目录 排序的概念 几种排序方法介绍 冒泡排序 选择排序 插入排序 堆排序 向上调整建堆排序 向下调整建堆排序 希尔排序 快速…...

数据结构面试知识点总结3
#来自ウルトラマンティガ(迪迦) 1 线性表 最基本、最简单、最常用的一种数据结构。一个线性表是 n 个具有相同特性的数据元素的有限序列。 特征:数据元素之间是一对一的逻辑关系。 第一个数据元素没有前驱,称为头结点࿱…...

python-爬虫实例(5):将进酒,杯莫停!
目录 前言 将进酒,杯莫停! 一、浇给 二、前摇 1.导入selenium库 2.下载浏览器驱动 三、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 博主身为一个农批,当然要尝试爬取王者荣耀的东西啦。 将进…...

AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理
AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【从零训练Transformer模型】之二 [ 从零训练一个模型 ] 的简单整理 一、简单介绍 二、Transformer 1、模型架构 2、应用场景 3、Hugging …...

十大排序的稳定性和时间复杂度
十大排序算法的稳定性和时间复杂度是数据结构和算法中的重要内容。 以下是对这些算法的稳定性和时间复杂度的详细分析: 稳定性 稳定性指的是排序算法在排序过程中是否能够保持相等元素的原始相对顺序。根据这个定义,我们可以将排序算法分为稳定排序和…...

【系列教程之】1、点亮一个LED灯
1、点亮一个LED灯 作者将狼才鲸创建日期2024-07-23 CSDN教程目录地址:【目录】8051汇编与C语言系列教程本Gitee仓库原始地址:才鲸嵌入式/8051_c51_单片机从汇编到C_从Boot到应用实践教程 本源码包含C语言和汇编工程,能直接在电脑中通过Keil…...

搜维尔科技:Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作
Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作 搜维尔科技:Manus Metagloves使用精确的量子跟踪技术捕捉手部每一个细节动作...

机器学习 | 阿里云安全恶意程序检测
目录 一、数据探索1.1 数据说明1.2 训练集数据探索1.2.1 数据特征类型1.2.2 数据分布1.2.3 缺失值1.2.4 异常值1.2.5 标签分布探索 1.3 测试集探索1.3.1 数据信息1.3.2 缺失值1.3.3 数据分布1.3.4 异常值 1.4 数据集联合分析1.4.1 file_id 分析1.4.2 API 分析 二、特征工程与基…...

python打包exe文件-实现记录
1、使用pyinstaller库 安装库: pip install pyinstaller打包命令标注主入库程序: pyinstaller -F.\程序入口文件.py 出现了一个问题就是我在打包运行之后会出现有一些插件没有被打包。 解决问题: 通过添加--hidden-importcomtypes.strea…...

基本的DQL语句-单表查询
一、DQL语言 DQL(Data Query Language 数据查询语言)。用途是查询数据库数据,如SELECT语句。是SQL语句 中最核心、最重要的语句,也是使用频率最高的语句。其中,可以根据表的结构和关系分为单表查询和多 表联查。 注意:所有的查询…...

Vue3 对比 Vue2
相关信息简介2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王) 2 年多开发, 100位贡献者, 2600次提交, 600次 PR、30个RFC Vue3 支持 vue2 的大多数特性 可以更好的支持 Typescript,提供了完整的…...

2024中国大学生算法设计超级联赛(1)
🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,彩笔ACMer一枚。 🏀所属专栏:杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 📢📢📢传送门 A - 循环位移解…...