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

初识MySQL · 索引

目录

前言:

重温磁盘

认识索引

为什么这么做,怎么做

重谈page

聚簇索引VS非聚簇索引

回表查询

 索引分类


前言:

前文我们主要是介绍了MySQL的一些基本操作,增删查改一类的操作都介绍了,并且因为大多数情况下,查询的频率远远高于其他操作,所以我们在查询上面,也是花费了一番功夫的。

那么本文,我们来介绍查询背后的机制——索引,大多数同学第一次接触到索引的时候,第一感觉肯定是:索引?我们C语言平常学习的索引吗?类似于数组下标一类的? 实则不然,在MySQL的索引大有不同。

我们在平时构建算法的时候,影响效率的不止有算法本身,实际上还有对数据的组织方式,比如同样是增删查改,对于顺序表和堆来说,二者对于这四个操作的效率肯定大不相同。那么我们在优化算法的时候,就可以着手于对数据的组织方式进行优化。索引的存在就是优化数据的组织方式的

所以,索引既然是优化的数据的组织方式的,那么,索引不就是数据结构吗?


重温磁盘

对于MySQL来说,我们有着和Linux中“万物皆文件”的一样的概念,即“一切皆表”,也就是说我们认为MySQL的所有数据都是一张一张的表构成的,不管是我们创建的,还是查询等操作产生的中间表,我们认为都是表。

即便我们从文件的角度来看,每次当我们创建了表之后,我们在MySQL的目录也能看到对应的文件生成:

类似于这个,目前我的MySQL版本是8.0的,如果有的同学的MySQL版本是5.7,那么还会看到生成了对应的表结构定义文件.frm,但是不幸的是.frm文件在8.0之后已经被弃用了,原因大致如下:

问题解释
一致性差.frm 是单文件,容易与 .ibd 不一致
不支持事务表结构变更不具备事务能力
不支持原子性DDL 操作不可回滚
无法跨平台.frm 二进制结构与平台、版本强耦合
不利于统一管理数据、索引、结构分散在多个文件中

好了,现在我们有一个认识:MySQL中不管是创建数据库,还是创建表,都在会实际的文件系统中创建真实的目录和文件

那么不就意味着,当我们在MySQL创建表的时候,是要和磁盘等外设打交道的,既然是要和磁盘等外设打交道,那么就要考虑IO的问题了,但是我们同时都知道的,根据冯诺依曼结构体系,处于应用层的MySQL是不能直接和硬盘打交道的,能和硬盘等外设打交道的只有OS,所以问题从MySQL如何和磁盘打交道转变为了MySQL如果通过OS,间接的和磁盘打交道

那么我们这个小标题,要解决的问题是OS如何和磁盘打交道的

基本的磁盘长什么样我们都知道,由多个盘片摞在一起,并且每个面都有一个磁头,一个盘片我们可以分出磁道,扇区等单位出来,磁道是一个一个的同心圆,多个磁道构成一个盘面,每个磁道被划分为一个一个的区域段,这个区域段我们就称为扇区。

那么有了磁头Heads,柱面Cylinder(等价于磁道),扇区(Sector),我们就能精准的找到磁盘中的某一个区域,这种磁盘数据定位方式叫做CHS,但是我们要知道,这是早期做法,因为它的数量有严格的限制,最多8.4GB左右,所以现在OS早已通过LBA,即Logical Block Addressing 这种逻辑寻址方式进行寻址。不过在早期的时候,磁盘控制器要求只能通过CHS进行访问,所以早期的时候是有LBA向CHS进行转换的,不过在当今的时代,基本上已经抛弃了CHS的做法。

但是我们清楚的时候,在第一次介绍文件系统的时候,我们清楚的知道OS和硬盘的数据交互一次性是4KB,也就是说如果我们只是修改一个字节,OS也要在磁盘中给你找到这1字节周围的4KB数据,然后再修改,这实际上用到了局部性原理,为了提高效率的。

现在我们就清楚了OS和磁盘打交道的基本单位是4KB,那么疑问来了,MySQL通过OS和磁盘打交道的基本单位是多少呢?

答案是:16KB。也就是说MySQL作为应用层服务来说,要交互一次数据,至少都是16KB起步,那么当交互的时候,OS怎么搬来的16KB数据MySQL不管,它只管要就可以了。那么我们如何验证MySQL交互数据的基本单位是16KB呢?我们可以通过命令show global status like 'innode_page_size'进行查看:

可以看到确实是16KB。

所以我们可以将MySQL和磁盘交互数据的时候应该是这样的:

其中的buffer pool是MySQL自己申请的缓冲区,相当于TCP中read也有自己的缓冲区一样。

那么我们从这里得出结论:MySQL通过OS和磁盘交互的基本数据单位是16KB


认识索引

前文我们花费些许功夫,通过磁盘的CHS,引出了操作系统的LBA,并且结合了OS与磁盘的基本交互是4KB,引出了MySQL和磁盘的交互单位是16KB,但是实际上,事实远远没有这么简单。那么16KB为什么不简单我们后面介绍。

对于索引,是通过改变数据的组织方式然后提高MySQL的效率的,所以它的本质,其实就是数据结构,那么我们来理解MySQL的索引是如何工作的。

首先我们建立一张表,这里我们最好加上主键约束

注意我们不是按照id的大小插入数据的,我们是随机插入的,但是当我们一查看数据的时候,我们发现:

它默认为我们进行了排序。

那么从这个现象,我们引出两个问题这个操作是谁做的,为什么要这么做? 重谈16KB

为什么这么做,怎么做

先给结论:MySQL自己做的,这么做的目的是为了方便引出目录

对于数据库来说,它的基本数据单位16KB都是要管理起来的,在源码中,它的基本管理方式是使用链表,就像这样:

那么现在,我们清楚每个16KB里面有数据,还有前后指针,并且在应用层是通过双向链表管理起来的,还发现每个16KB,被称呼为page。

对于每个page来说,它里面有大量的数据,不同的page链接在一起,但是这样的数据组织方式是双向链表,数据查找的时候,仍然是线性的,可以说在大量数据的时候,这种模式下MySQL会一个一个遍历的每个page,按照顺序遍历,找到了直接返回即可。

这不就是一个一个的查嘛?那么时间复杂度就是O(N),这个N在实际的数据中,可能是几百万,可能是几亿,那你让如此脆弱的MySQL完成这么个操作,那它一天啥事也不用干了,光崩溃就可以了。

所以这里,我们引入了目录

首先在每个page里面,引入一个目录:比如一号目录映射到了1,二号目录映射到了3,那么我要查2号数据的时候,通过目录1,找到了1号数据,然后往下走一步,就是2号数据了。这个过程的思想就是通过目录,一次性干掉大部分数据。通过目录,能一次性筛选掉其他目录的所有的指向数据,这个操作实际上就是我们平时读书的时候,查阅目录的方式是一样的。

但是这种操作实际上并不能很好解决问题,它的本质还是线性遍历的,因为你要使用目录,但是前置条件是你能遍历到目录的那个page,这不还是链表的遍历吗?

所以在page内已有目录的基础之上,我们的解决思路也是简单的,我们给page也指定目录,也就是说在数据有目录的基础之上,我们对不同的page,也指定上目录,图大致是这样的:

这样,就能通过第一层目录,快速定位到对应数据的page的附近,然后遍历到page再次通过目录,快速定位到数据的附近,运气好可以直接命中,这效率提高的就非常多了。

那么现在就可以回答刚才的问题了:MySQL为什么要自己排序?因为目录指代的顺序不能错乱了,错乱了目录无法正确定位。

现在还可以回答一个问题,为什么要使用主键约束?不使用可以吗?

答案是可以,如果我们不使用主键,也没有唯一键和Not null的列,InnoDB 会自动生成一个隐藏的6字节的row id作为主键,并建立聚簇索引。

所以实际上的page的组织结构就是这样的,反正遍历某个目录的时候,如果太花时间了,再来一个目录就行,而如果我们仔细一看这个结构,不就是传说中的B+树吗!!所以得出结论,存储引擎innnodb采取的索引方式是B+树。那么其他结构为什么不行,比如hash,它不支持范围查找,因为查找它需要映射,比如红黑树,红黑树和AVL树都是近似平衡或者绝对平衡,这就意味着每一层都会有节点,也就是说它很高,而B+树是矮胖的,层高越低,和系统磁盘交互的次数就很少,所以红黑树也pass,至于二叉平衡树就不用说了。

特性 / 数据结构B+树红黑树AVL树Hash
是否支持范围查询✅ 是,效率高(叶子节点有序且链表连接)❌ 不直接支持(需中序遍历)❌ 不直接支持❌ 不支持
节点扇出(分支数量)高(每页存多个key)低(每节点2个子节点)N/A
树高度(影响IO次数)矮(logₘN)较高(log₂N)更高(比红黑树高)无树结构
适合数据规模大数据量、磁盘存储小数据量、内存结构小数据量、内存结构精确查询、大数据量
插入/删除性能中等,代价为平衡和分裂快速,近似平衡较慢(频繁旋转)快(无排序要求)
是否顺序存储✅ 叶子节点有序、链表相连❌ 否❌ 否❌ 否
磁盘友好性✅ 高,每个节点可对应一个磁盘页❌ 差,节点少无法利用页空间❌ 差❌ 差
典型应用场景数据库索引(如 InnoDB)操作系统调度/平衡集合编译器语法树等缓存(如 Redis)、哈希索引

重谈page

前文我们提及,MySQL的Innodb是通过page这个基本单位来和磁盘进行交互的,那么在如果构建索引的部分,我们发现这个基本单位里面有前后指针,有目录结构,有各种数据,那么交互的单位真的单纯只是一个内存块的话,是不太能执行这样的操作,所以对于16KB,我们仍然是:先描述再组织

即对于每个page都要存入相关信息,然后在buffer pool里面对它们进行一个管理,buffer pool就是MySQL的存储引擎Innodb的缓冲区,我们也可以在MySQL的配置文件里看到,如果有的时候没看到也不代表它没有,MySQL有对应的默认行为的。

那么重归到Page里面,我们可以非常非常粗略地认为page是这样的:

struct InnoDBPage {byte file_header[38];       // 文件头byte page_header[56];       // 页头信息Record infimum;             // 最小记录Record supremum;            // 最大记录Record user_records[];      // 用户插入的数据记录byte free_space[];          // 空闲空间byte page_directory[];      // 槽指针(指向记录)byte file_trailer[8];       // 文件尾部校验InnoDBPage* next;InnoDBpage* prev;
};

所以MySQL中的索引,实际上是某个存储引擎,基于某种特定的组织方式进行的数据排列而已。

聚簇索引VS非聚簇索引

根据上文的描述,我们很明显能够发现Innodb的索引的数据本身都是放在最后一层的,目录都是在其他层,这种数据本身和目录放在统一结构的索引,我们称为聚簇索引,对于MyIsam来说,它同样使用的是B+树作为索引,但是它和Innodb不同的是它的叶节点存储的是数据记录的地址

也就是说MyIsam的叶结构指向的是数据的地址,那么它的数据本身没有和目录放在一起,所以哦我们称呼这种索引为非聚簇索引

回表查询

对于主键索引来说,我们发现一个点就是,索引好像只有主键才有?那么我们查其他字段怎么办?能不能给其他列建立一个辅助索引?

当然是可以的,我们可以通过命令create index index_name on table_name(对应列名)来创建对应的辅助索引,就像这样:

然后我们就可以通过show index from test_3查看对应的索引信息了:

在 InnoDB 中,如果我们通过辅助索引(二级索引)来查询数据,且查询的字段不在辅助索引中,就会发生“回表操作”。
假设有三个列:A(主键)、B、C,其中我们对 C 建了索引,A 是主键。
当我们执行 SELECT B FROM test_table WHERE C = 'xxx' 这个语句时:

  1. MySQL 会先通过 idx_C(C 列上的辅助索引)定位满足条件的记录的主键 A;

  2. 再通过主键 A 回到聚簇索引中查找完整的数据行,拿到 B 的值。

因为在 InnoDB 中,辅助索引结构只包含:被索引的列 + 主键列,不包含其它字段,所以我们必须“回表”才能拿到未包含的字段(如 B)。

优点缺点
利用辅助索引快速定位主键回表需要额外查询,性能下降
辅助索引占用空间小增加查询的 I/O 操作
支持多种查询条件查询字段不在索引中时必须回表

我们前文提及了索引的作用就是为了减少系统的IO次数,那么,回表无疑增加了IO次数,所以我们可以通过覆盖索引解决回表查询的缺点:

CREATE TABLE test (id INT PRIMARY KEY,name VARCHAR(50),age INT,email VARCHAR(100),INDEX idx_name_age (name, age)
);
SELECT name, age FROM test WHERE name = 'Tom';

即我们让查询的数据都在一起,不去主键索引里面找就可以了。那么针对于辅助索引来说Innodb是不会所有的叶子节点额外加数据的,因为太浪费空间了

不过如果使用了覆盖索引,我们查询的时候会看到两个索引,但是实际上是一个:


 索引分类

索引分为主键索引,唯一键索引,普通索引,全文索引。其中普通索引我们已经通过回表查询简单的介绍了,其实普通索引有多种创建方式分别是:

create table user8(id int primary key,name varchar(20),email varchar(30),index(name) --在表的定义最后,指定某列为索引
);
create table user9(
id int primary key,
name varchar(20),
email varchar(30));
alter table user9 add index(name); --创建完表以后指定某列为普通索引
create table user10(
id int primary key,
name varchar(20),  
email varchar(30));-- 创建一个索引名为 idx_name 的索引    
create index idx_name on user10(name);

这种方式都可以成功创建一个辅助索引。

而对于主键索引和唯一键索引我们可以理解为:创建主键索引和唯一键索引实际上是创建主键和唯一键,不管是哪种方式,创建表的时候就指定了主键或者创建完之后新增主键,Innodb都会创建对应的索引。

不过实际上唯一键索引它就是辅助索引,不过多了唯一性约束而已。

类型是否唯一是否聚簇自动建索引特点
主键(PRIMARY)✅ 是✅ 是✅ 是一张表只能有一个,行按主键排序存储
唯一键(UNIQUE)✅ 是❌ 否✅ 是可有多个,索引中也包含主键列作为引用
普通索引(INDEX)❌ 否❌ 否手动创建可有多个,用于优化查询

删除索引的操作有三种,一种是直接删除对应的主键,唯一键等。一种是alter table tablename drop index indexname.一种是drop index name on tablename。

对于全文索引这里不做讨论。


感谢阅读!

相关文章:

初识MySQL · 索引

目录 前言: 重温磁盘 认识索引 为什么这么做,怎么做 重谈page 聚簇索引VS非聚簇索引 回表查询 索引分类 前言: 前文我们主要是介绍了MySQL的一些基本操作,增删查改一类的操作都介绍了,并且因为大多数情况下&am…...

Kubernetes in action-配置和应用升级

Kubernetes的配置和应用升级 1、配置1.1 configMap1.2 secret1.3 Downward API1.4 Kubernetes API 2、服务升级2.1 升级方式2.1.1 先删除所有的旧版pod,使用新版本pod替换2.1.2 先创建新版pod,再删除旧版本pod2.1.3 滚动优化 2.2 使用deployment声明式升…...

十三、面向对象底层逻辑-Dubbo序列化Serialization接口

一、引言:分布式通信的数据桥梁 在分布式服务调用中,参数的跨网络传输需要将对象转化为二进制流,这一过程直接影响系统的性能、兼容性与安全性。Dubbo通过Serialization接口构建了可扩展的序列化体系,支持多种序列化协议的无缝切…...

5.19 打卡

DAY 30 模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入...

MathType公式如何按照(1)(2)…编号

在word中使用mathtype插入公式,发现插入的公式编号默认为(1.1),(1.2)…,但论文中常用的公式编号是(1)(2)…,分享一下如何实现(1.1)→(1)。 ①word菜单找到“MathType”,点击“插入编号”-“格式化”。 ②取消勾选“章编号”和“节…...

解决即使安装了pageoffice网页还是无法跳转、点击按钮没有反应等问题

出现的现象: 安装了pageoffice网页还是无法跳转、点击按钮没有反应 网页提示的错误: 点击按钮之前右键检查网页发现的错误: 点击无效按钮之后右键检查出现的错误: 原因: 鉴于安全性的考虑,新版浏览器不支…...

正点原子STM32新建工程

MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。 MDK5 由两个部分组成: MDK Core 和 Software Packs。 MDK Core 又分成四个部分: uVision IDE with Editor(编辑器), ARMC/C Compiler(编译…...

计算机网络 第三章:运输层(一)

运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。该层为运行在不同主机上的应用进程提供直接的通信服务。通常特别关注因特网协议,即 TCP 和 UDP 运输层协议。 讨论运输层和网络层的关析,为研究运输层第一个关键功能&#xff…...

机器学习(14)——模型调参

文章目录 一、动态调参方法论1. 调参策略选择2. 千万数据优化原则 二、模型调参策略对比1. LightGBM调参路线2. XGBoost调参路线3. 随机森林调参策略 三、代码实现示例通用数据准备(适用于所有模型)1. LightGBM调参示例2. XGBoost调参示例3. 随机森林调参…...

基于PetaLinux的Zynq PS应用自启动全攻略

一、嵌入式Linux启动管理的艺术 在工业机器人、智能摄像头、边缘计算网关等场景中,开机自启动管理是系统可靠性的第一道关卡。本文将深入讲解Zynq PS端在PetaLinux环境下实现: Systemd服务深度定制启动时序精准控制启动速度优化技巧动态服务管理创新方案二、环境搭建与工程配…...

贪心算法:多处最优服务次序、删数问题

多处最优服务次序问题 问题描述:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti(1≤i≤n),共有s处可以提供此项服务。应如何安排n个顾客的服务次序,才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。 算法设计:对于给定的n个顾…...

使用 Flask 框架实现FTP,允许用户通过 Web 界面浏览和下载文件夹中的所有文件

Flask 文件和文件夹下载服务实现 以下是一个基于 Flask 框架的简单 Web 服务,用于开放指定文件夹(./shared_files),允许用户通过浏览器浏览和下载文件夹中的所有文件和子文件夹。ZIP 和 TAR 文件将直接下载,而文件夹将…...

【Go】从0开始学习Go

文章目录 从0开始学习Go0 与C对比1 代码框架1.1 helloworld式代码示例1.2 主体代码元素(核心三部分)1.3 其他 2 与C/C区别3 有用的小工具4 注意事项 从0开始学习Go 0 与C对比 特性CGo编译型语言需要编译为机器码直接编译为二进制可执行文件静态类型类型…...

软件设计师SQL考点分析——求三连

一、考点分值占比与趋势分析 综合知识分值统计表(75分制) 年份考题数量分值分值占比考察重点2018334%关系代数、权限控制2019222.67%SQL注入、授权语句2020445.33%投影操作、权限回收2021334%视图操作、权限传递2022222.67%数据库安全、WITH GRANT OPT…...

使用tcs34725传感器和51单片机识别颜色

使用TCS34725颜色传感器和51单片机来识别颜色是一个非常有趣的项目。TCS34725是一种常用的RGB颜色传感器,能够测量红、绿、蓝光的强度,从而实现颜色识别。 1. 硬件连接 TCS34725传感器通过IC接口与51单片机连接。以下是连接方式: SDA&…...

数据库-oracle-包-视图传参

并发下可能不准确 -- 修改包规范 CREATE OR REPLACE PACKAGE sczz.p_view_param IS function set_n(n varchar2) return varchar2; function get_n return varchar2; function set_ny(ny varchar2) return varchar2; function get_ny return varchar2; …...

深入探讨Java中的上下文传递与ThreadLocal的局限性及Scoped Values的兴起

在Java开发中,特别是在依赖框架的应用程序中,上下文数据的管理是一个常见但具有挑战性的问题。上下文数据可能包括元数据、配置信息或其他需要在代码不同部分之间共享的信息。传统的做法是通过方法参数显式传递这些上下文,但这种方法会导致代码复杂、难以维护,尤其是在大型…...

Spring boot 学习笔记2

Maven 项目管理工具:Maven 通过 pom.xml(Project Object Model)文件描述项目配置,包括依赖、构建流程、插件等,实现项目标准化管理 依赖管理:自动下载并管理项目所需的第三方库(如 Spring、MyB…...

“保证医疗器械信息来源合法 真实、安全的保障措施、情况说明及相关证明”模板

保证医疗器械信息来源合法真实、安全的保障措施、情况说明及相关证明 一、医疗器械信息来源合法、真实、安全的管理措施 目前我公司网站所展示的医疗器械是企业代理品种,是取得合法注册资格的产品,拥有合法证明文件的产品。本网站仅展示本公司行政许可…...

Feature Toggle 不再乱:如何设计一个干净、安全、可控的特性开关系统?

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

不锈钢保温容器行业2025数据分析报告

不锈钢保温容器市场概况 2024年全球不锈钢保温容器市场规模约为453.3亿元,预计到2031年将增长至608.3亿元,年均复合增长率(CAGR)为4.3%。这一增长主要得益于全球范围内对保温容器需求的持续增加,尤其是在户外活动、餐…...

leetcode239 滑动窗口最大值deque方式

这段文字描述的是使用单调队列&#xff08;Monotonic Queue&#xff09; 解决滑动窗口最大值问题的优化算法。我来简单解释一下&#xff1a; 核心思路 问题分析&#xff1a;在滑动窗口中&#xff0c;若存在两个下标 i < j 且 nums[i] ≤ nums[j]&#xff0c;则 nums[i] 永远…...

腾讯云怎么在游戏云中助力

腾讯云游戏云&#xff1a;依托深厚游戏基因&#xff0c;打造高质量全方位生态平台 在竞争激烈的云计算市场中&#xff0c;腾讯云凭借其得天独厚的游戏生态资源和深耕多年的技术沉淀&#xff0c;正成为游戏行业不可忽视的重要力量。腾讯不仅是全球领先的游戏开发和发行商&#…...

深入理解pip:Python包管理的核心工具与实战指南

# 深入理解pip&#xff1a;Python包管理的核心工具与实战指南 在Python开发中&#xff0c;第三方库是提升效率的关键。而pip作为Python官方的包管理工具&#xff0c;承担着安装、卸载、升级和管理库的重要职责。本文将全面解析pip的核心命令&#xff0c;结合实例演示用法&#…...

【python】windows修改 pip 默认安装路径

在 Windows 系统 下&#xff0c;希望修改 pip 默认安装路径&#xff0c;结合你前面贴的图片和信息&#xff0c;一个 推荐做法&#xff08;不修改 site.py&#xff09;的完整教程。 目标&#xff1a;让 pip 安装包默认装到你指定的路径&#xff08;如 D:\MyPythonLibs&#xff…...

Python函数——万字详解

—— 小 峰 编 程 导 语&#xff1a; 从今天开始&#xff0c;我们将进入第二模块的学习——函数。第一模块主要是学习python基础知识&#xff0c;从第二模块开始就可以通过程序去解决工作中实际的问题。从今天开始&#xff0c;我们将进入第二模块的学习&#xff0c;此模块…...

es在已有历史数据的文档新增加字段操作

新增字段设置默认值 场景 在已经有大量数据的索引文档上&#xff0c;增加新字段 技术实现 一.更新索引映射 通过PUT请求显式定义新字段类型&#xff0c;确保后续写入的文档能被正确解析 PUT /文档名/_mapping {"properties": {"字段名1": {"type…...

LeetCode 35 搜索插入位置题解

LeetCode 35 搜索插入位置题解 题目描述 题目链接 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置&#xff08;需保证数组仍然有序&#xff09;。要求时间复杂度为 O(log n)。…...

RabbitMQ通信模式(Simplest)Python示例

RabbitMQ通信模式-Python示例 0.RabbitMQ官网通信模式1.Simplest(简单)模式1.1 发送端1.2 接收端 0.RabbitMQ官网通信模式 1.Simplest(简单)模式 1.1 发送端 # -*- coding: utf-8 -*- """ Author: xxx date: 2025/5/19 11:30 Description: Simaple简单模…...

游戏开发实战(一):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】

文章目录 奇美拉项目游戏规则奇美拉(Chimeras)档案领队成员 结果展示&#xff1a; 奇美拉项目 由于项目工程较大&#xff0c;并且我打算把我的思考过程和实现过程中踩过的坑都分享一下&#xff0c;因此会分3-4篇博文详细讲解本项目。本文首先介绍下游戏规则并给出奇美拉档案。…...

力扣热题100之删除链表的倒数第N个节点

题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 代码 方法一 将链表中的值放入列表中&#xff0c;然后删除倒数第n个值&#xff0c;再将剩下的数依次转化为链表 # Definition for singly-linked list. # class ListNode: # …...

OCframework编译Swift

建一个OC的framework&#xff1a; 需要对外暴露的OC文件&#xff0c;需要放到OC的.h文件中 framework中&#xff0c;OC类&#xff0c;调用framework中的Swift类&#xff1a; #import "WowAudioFocus/WowAudioFocus-Swift.h" //02 #import "{工程名}/{工程…...

【AI News | 20250519】每日AI进展

AI Repos 1、deepdrone DeepDrone是一款基于smolagents框架的无人机聊天代理&#xff0c;集成DroneKit实现无人机分析与操作。用户可通过自然语言聊天与无人机助手交互&#xff0c;实现飞行路径和传感器数据可视化、基于飞行时长的维护建议、任务规划以及真实的无人机控制&…...

分布式ID生成系统

代码地址: github mid 简介 分布式 ID 生成系统是一个高性能、可靠的 ID 生成服务,支持两种模式:Snowflake(基于时间戳的内存生成)和 Segment(基于 MySQL 的号段分配)。系统采用双 Buffer 策略优化性能,集成 Prometheus 监控和 Zap 结构化日志,确保高可用性和可观测性…...

MAC常用操作整理

音量方法&#xff1a; 电脑键盘的右上角就有静音和不静音的按钮&#xff0c;还有调节音量的按钮&#xff0c;调节屏幕亮度的按钮 切换输入法方法&#xff1a; 1.大写按键&#xff0c;2.function按键(fn), 3.control 空格键, 选择上一个输入法&#xff0c;4.controloption空格…...

【Canvas与图标】圆角方块蓝星CSS图标

【成图】 120*120的png图标 大小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>圆角方块蓝星CSS Draft1</…...

易境通散货拼柜系统:提高货代企业货物配载效率

在国际物流代理运输领域&#xff0c;货物配载是整个供应链的核心环节&#xff0c;其优化对于提升整个供应链的效率至关重要。传统的配载管理方式往往依赖人工操作&#xff0c;不仅效率低下&#xff0c;还容易出现错误。面对多订单、多货主、多目的地的复杂场景&#xff0c;传统…...

[Spring Boot]整合Java Mail实现Outlook发送邮件

日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等。日常比较常用的邮件发送方包括:163、QQ等,本文主要讲解Outlook SMTP的开启方式、OutLook STARTTTL的配置、如何通过JavaMail来实现电子邮件的发送等。 Outlook作为微软提供的企业电子…...

【盈达科技】GEO优化实战策略

提升内容在生成式引擎中的可见性&#xff1a;实战策略 随着生成式引擎&#xff08;Generative Engines, GEs&#xff09;的兴起&#xff0c;内容创作者面临着新的挑战和机遇。这些引擎通过整合和总结多源信息来提供精准且个性化的回答&#xff0c;正在迅速取代传统搜索引擎。为…...

HTTP 协议基础

本篇文章会从如下角度介绍 HTTP 协议&#xff1a; 原理与工作机制请求方法与状态码Header 与 Body 1、原理与工作机制 1.1 HTTP 是什么 HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;"超"表示扩展而非超级&#xff0c;即可以链接到其他文本…...

ros运行包,Ubuntu20.04成功运行LIO-SAM

zz:~/lio_sam_ws$ source devel/setup.bash zz:~/lio_sam_ws$ roslaunch lio_sam run.launch 创建包链接&#xff1a; 链接1&#xff1a;Ubuntu20.04成功运行LIO-SAM_ubuntu20.04运行liosam-CSDN博客 链接2&#xff1a;ubuntu 20.04 ROS 编译和运行 lio-sam,并且导出PCD文件…...

Linux《自主Shell命令行解释器》

在上一篇的进程控制当中我们已经了解了进程退出、进程等待以及进程替换的相关概念&#xff0c;那么在了解了这些的概念之后接下来在本篇当中我们就可以结合之前我们学习的知识来实现一个自主的Shell命令行解释器&#xff0c;通过Shell的实现能让我们进一步的理解操作系统当中的…...

设置IDEA打开新项目使用JDK17

由于最近在学习Spring-AI&#xff0c;所以JDK8已经不适用了&#xff0c;但是每次创建新项目都还是JDK8&#xff0c;每次调来调去很麻烦 把Projects和SDKs都调整为JDK17即可 同时&#xff0c;Maven也要做些更改&#xff0c;主要是添加build标签 <build><plugins>&…...

Vue百日学习计划Day36-42天详细计划-Gemini版

总目标: 在 Day 36-42 理解组件化开发的思想&#xff0c;熟练掌握 Vue 组件的注册、Props、Events、v-model、Slots、Provide/Inject 等核心概念和实践&#xff0c;能够构建可复用和易于维护的组件结构。 所需资源: Vue 3 官方文档 (组件基础): https://cn.vuejs.org/guide/es…...

Python对JSON数据操作

在Python中&#xff0c;对JSON数据进行增删改查及加载保存操作&#xff0c;主要通过内置的json模块实现。 一、基础操作 1. 加载JSON数据 • 从文件加载 使用json.load()读取JSON文件并转换为Python对象&#xff08;字典/列表&#xff09;&#xff1a; import json with open…...

upload靶场1-5关

网上的解析有一些题目对应不上&#xff0c;比如第五关说是 空格 点 空格绕过 &#xff0c;我这里就无法成功解析&#xff0c;但大小写绕过就成功了&#xff0c;慢慢会把后面的关卡也写出来 这里建议开一台win7的虚拟机&#xff0c;在上面搭建靶场&#xff0c;可以省很多麻烦 …...

网络传输(ping命令,wget命令,curl命令),端口

网络传输&#xff1a; ping命令&#xff1a;检查指定的网络服务器是否是可联通状态 语法&#xff1a;ping 【-c num】IP或主机名 -c&#xff1a;是检查的次数&#xff0c;不使用-c&#xff0c;将无限次持续检查 wget命令&#xff1a;wget是非交互式的文件下载器&#xff0…...

upload-labs靶场通关详解:第10关

一、分析源代码 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array(".php",".php5",".php4",".php3",".php2",".html",".htm",".ph…...

深入解析`lsof`命令:查看系统中打开文件与进程信息

1、lsof的基本概念 lsof &#xff08;List Open Files&#xff09; 提供了一种方式来查看系统上哪些进程正在访问哪些文件&#xff0c;能够显示文件类型、文件名、文件描述符、所属进程等详细信息。 在类Unix系统中&#xff0c;几乎所有的操作都与文件相关联&#xff0c;文件不…...

C++ 与 Python 内存分配策略对比

内存管理是编程中的一个核心概念&#xff0c;它直接影响程序的性能、稳定性和资源利用率。C 和 Python 作为两种广泛使用的编程语言&#xff0c;在内存分配和管理方面采用了截然不同的策略。 C 内存分配策略 C 赋予程序员对内存的精细控制能力&#xff0c;同时也带来了更大的…...