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

MySQL进阶篇2_SQL优化、锁

文章目录

  • 1 SQL优化
    • 1.1插入数据优化
    • 1.2主键优化
      • 页分裂
      • 页合并
      • 主键设计原则
    • 1.3order by设计优化
    • 1.4group by设计优化
      • 小理解
    • 1.5limit设计优化
      • 顺序IO和随机IO小疑惑
    • 1.6count设计优化
    • 1.7update优化
    • 关于隐式事务事务的DML操作
    • 全局锁
    • 表级锁
      • 表锁
      • 元数据锁
      • 意向锁
    • 行级锁
    • 锁的释放条件

1 SQL优化

讲一些SQL语句的性能优化

1.1插入数据优化

  • 普通插入

1.采用批量插入(一次插入的数据不建议超过1000条)

INSERT INTO tb_test VALUES(1, 'Tom'), (2, 'Cat'), (3, 'Jerry');

2.手动提交事务
默认情况下,mysql执行单个insert语句会开启事务,insert执行完结束
这样单个insert语句事务就加入我们声明的事务,将所有事务变成一个事务,节省事务开启结束时间

START TRANSACTION;
INSERT INTO tb test VALUES(1, 'Tom'), (2, 'Cat'), (3, 'Jerry');
INSERT INTO tb test VALUES(4, 'Tom'), (5, 'Cat'), (6, 'lerry');
INSERT INTO tb test VALUES(7, 'Tom'), (8, 'Cat'), (9, 'lerry');
COMMIT;

在这里插入图片描述

3.主键顺序插入
主键顺序插入性能优于主键乱序插入(涉及到树的查找和优化)。-主键优化,看完主键结构即可理解

  • 大批量插入:

load命令插入

-- 客户端连接服务端时,加上参数  -–local-infilemysql –-local-infile  -u  root  -p-- 设置全局参数local_infile为1,开启从本地加载文件导入数据的开关set  global  local_infile = 1;
-- 执行load指令将准备好的数据,加载到表结构中
load  data  local  infile  '/root/sql1.log'  into  table  tb_user  fields  
terminated  by  ','  lines  terminated  by  '\n' ; 

视频操作

1.2主键优化

数据组织方式:在innodb存储引擎中,表数据都是根据主键顺序存放的,这种存储方式的表称为索引组织表。

非叶子节点的索引和叶子节点的数据都存放在page里,一个extent(区)-1MB中可以存放64个page(页)-16KB
InnoDB的内存组织结构

页分裂

除了新增页,新申请的空间,正常页至少包含两条数据
正常你按主键顺序插入
在这里插入图片描述
不按主键顺序插入的话会出现页分裂
比如现在要插入50
在这里插入图片描述
但是1页满了,所以要申请新一页来存储,将50放入,需要将1页的后50%元素(即23和47)移入3页和50凑成一页,这个就叫页分裂

为什么要数据重新分配?-将原页后50%和新增数据合并(问AI)
在这里插入图片描述然后他们页之间进行一下排序,1-3-2这样
在这里插入图片描述

页合并

如果一个数据源恰删数据删除后只剩50%不到数据(占页空间大小一半不到),会发出合并请求,找两边的页,如果恰好两侧的页也有不足50%的页,这两个页的数据就会合并
在这里插入图片描述

主键设计原则

  • ①满足业务需求的情况下,尽量降低主键长度。

  • ②插入数据时,尽量选择顺序插入,选择使用auto_increment自增主键。

  • ③尽量不要使用uuid做主键或者其他自然主键,如身份证号。(但是由于分布式的影响现在基本都是用雪花算法这种)

  • ④业务操作时,尽量避免对主键的修改。

1.3order by设计优化

MySQL的排序,有两种方式:
Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。
Using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,操作效率高。

对于以上的两种排序方式,Using index的性能高,我们在优化排序操作时,尽量要优化为 Using index

create  index  idx_user_age_phone_aa  on  tb_user(age [asc/desc],phone [asc/desc]);
explain select  id,age,phone from tb_user order by age, phone

在这里插入图片描述
现在我们建立联合索引默认升序
如果order by age desc,phone desc;会多显示一个Backward index scan;-反向扫描索引
也是用了索引,性能方面没什么影响
在这里插入图片描述

  • 1.两个都升序或者两个都降序,走联合索引
  • 2.要遵循最左前缀原则,单phone排序,但是没有单phone索引,有age,phone联合索引就不行
  • 3.如果要求按先phone后age进行排序,但是生成的索引是先age后phone,那么还是出现using filesort;创建索引前后字段结构要和排序前后字段结构要相同(和索引底层结构有关)
  • 4.如果要求按先按age升序排列,后按phone降序排列,此时生成的索引是先age后phone,那么还是出现using filesort,因为创建索引的时候默认collation为A,即为asc,按升序排列的。

联合索引,它不是单独的按谁排列的,它是根据两个字段一起排列的合并结果,数据列是phone和age的共同排序结果,所以这个用不了反向扫描

一个升序一个降序,需要重新创建索引。
创建如下索引即可解决

create index index_age_pho_ad on tb_user(age asc,phone desc);
  • 5.最好使用覆盖索引,如果表数据量太少都可能不回表查询,直接全表扫了
  • 6.如果不可避免地出现filesort,可以适当增大排序缓冲区大小sort_buffer_size(默认256k)

1.4group by设计优化

group by也要遵循最左前缀使用原则

没有创建索引时候

explain select profession,count(*) from  tb_user group by profession;

using temporary-使用临时表,效率不高
在这里插入图片描述
创建索引后

create index idx_user_pro_age_sta on tb_user(profession,status);explain select profession,count(*) from  tb_user group by profession;

这样就会用到索引
在这里插入图片描述

explain select age,count(*) from  tb_user group by age;

这样的话,既会使用到索引也会使用到临时表

具体内部怎么执行?
为什么用索引:因为全表扫描和查索引差不多,索引不用回表查age就在索引结构中,索引这里只起到提供数据的作用
具体执行过程
在这里插入图片描述

在这里插入图片描述
如果两个字段都用(有最左且连续)

explain select profession,age,count(*) from  tb_user group by profession,age;

正常using index
在这里插入图片描述

思考下面这条sql的执行计划是怎么样的

explain select age,count(*) from tb_user where 
profession='软件工程' group by age;

正常使用index,为什么和之前的单用age分组不一样呢?
因为满足最左前缀使用法则,where 筛选中用了profession

小理解

看完上面那个思考
我认为group by order by
其实和where后面字段一样,只要用的话,都会用索引
order by和group by列顺序和联合索引顺序一致的时候,才是最高性能的时候

1.5limit设计优化

无论你是根据索引还是根据全表查(Using filesort)都要获取前20000条数据
而且limit实际一般会和我们的order by联合使用
这样一般就用的是索引,因为最后是一张链表嘛,需要一个一个遍历元素
注:Using filesort虽然说是照物理结构读取,但是底层物理结构不是数组,其实还是通过B+树叶子节点的链表查询,这里的叶子节点其实是页(Page),获取到页内后,逐行读取页内数据(计数器累加行数,再到下一个页累加,直到达到 offset=20000),然后读取后10个再输出
在这里插入图片描述
我们可以通过连表查询的方式
我们可以通过覆盖索引+子查询

SELECT * FROM your_table ORDER BY id LIMIT 50000, 10;

先查询对应的主键id,再根据主键联表查

SELECT * FROM your_table 
INNER JOIN (SELECT id FROM your_table ORDER BY id LIMIT 50000, 10
) AS tmp where your_table.id=tmp.id;

有的同志可能又疑问了,这不还是根据链表查询吗?
还是要查前50000条数据啊,为什么下面的就比上面的效率高呢

  • 1.仅读取索引字段(如 id):索引存储在独立的 B+树中,体积更小,通常可完全载入内存。
    尽管这个是主键索引,下面是data,但是我们只读取索引字段id即可,不访问data,而select *则需要访问叶子节点的数据字段data
  • 2.是这条sql完全不需要回表查询,因为id是主键
  • 3.顺序访问:如果顺序插入(无修改),主键索引的叶子节点物理地址就会连续,扫描时是 连续 I/O(高效)。

所以子查询会很快,子查询查出来后联表根据id条件查,那也很快
在这里插入图片描述

顺序IO和随机IO小疑惑

这样说吧,顺序IO和随机IO是不由我们自己决定的
我们要做的就是,最好顺序插入数据,减少页分裂现象
页分裂会123页换成132页,原来123逻辑物理地址相同,现在132逻辑物理就不同,物理地址不同,就需要移动磁头1-2-3本来顺序移动磁头,现在1-3-2要从1-3移动一次3-2又要移动一次-这就变成随机IO了,效率就会低。

顺序I/O的优势体现在:

  • 磁盘寻道时间减少:磁头不需要频繁移动
  • 预读机制有效:数据库可以提前读取后续数据块
  • 缓存命中率提高:连续的数据块更容易被保留在内存中

1.6count设计优化

问题: InnoDB引擎执行count(*)的时候,需要把数据一行一行地从引擎中读出来,然后累积计数
: MyISAM引擎把一个表地总行数存在了磁盘上,没有where条件地时候,就会直接返回这个数,效率很高。
优化思路: 自己计数,在Redis中保存一个数来记录

count的几种用法
count()会一行一行数据进行判断,如果count函数的参数不是NULL,累计值就加1,否则不加

用法
count(*) ——总记录数,不取值直接累加

count(主键) ——取主键值,直接按行累加,但不用判断null

count(字段) ——加NOT NULL取字段值按行累加(不是累加字段值,是累加一个字段算一行的总行数,但是会取出字段值),没加NOT NUL约束情况时,如果NULL不加

count(1) ——InnoDB引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”,直接按行进行累加。

优化: count(*) ~ count(1) > count(主键id) > count(字段)

理论count(*)最快

1.7update优化

update主要就是避免表锁,将表锁降级为行锁

没有索引就会锁住整张表

优化: 根据索引字段进行更新,并且索引字段不能失效,否则行锁就会升级为表锁,影响并发性能

关于隐式事务事务的DML操作

默认autocommit=1
每个 DML 语句都会隐式开启一个事务,并在执行后立即自动提交。

INSERT INTO users (name) VALUES ('Alice'); -- 隐式开启事务 → 执行 → 自动提交
UPDATE users SET name='Bob' WHERE id=1;     -- 隐式开启事务 → 执行 → 自动提交

下面的DDL和隐式事务,这种情况不多,涉及元数据锁
这里展示DML和DDL在一个事务
在这里插入图片描述
如果不是一个事务DDL会等带DML的事务提交后再进行操作,如下图
在这里插入图片描述

innodb引擎中锁的分类

  • 全局锁:锁定数据库中所有的表
  • 表级锁:每次操作锁住整张表
  • 行级锁:每次操作锁住对应的行数据

全局锁

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。

其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
备份Mysql数据库
1.可以在navicat直接转存sql文件

2.可以使用Mysql自带的 mysqldump 工具来备份数据库。该工具可以生成 SQL 脚本文件,包含数据库中所有表和数据的语句

mysqldump -u [username] -p [database_name] > [backup_file].sql
# [username] 是 MySQL ⽤户名
#[database_name] 是需要备份的数据库名称,[backup_file].sql 是备份的⽂件名。

恢复Mysql数据库
1.一般都是直接把sql文件拖入navicat

2.如果要恢复数据库,前提要有备份的文件。可以运行以下命令:

mysql -u [username] -p [database_name] < [backup_file].sql
# [username] 是 MySQL ⽤户名
# [database_name] 是需要恢复的数据库名称,[backup_file].sql 是备份的文件名。

为什么备份库需要给库上全局锁?
因为可能几个表之间有关联,导致数据的逻辑不匹配
比如:备份库存表之后,扣减库存,又生成订单,再备份订单,这样造成了库存表没有去减1,但是多了个订单对不上库存了

使用mysqldump的时候不会自动使用全局锁,而是使用表锁,通过 LOCK TABLES 对每个表依次加读锁(READ LOCK)备份期间该表只读(其他会话写入会阻塞)
所以我们要自己实现全局锁

语法
1). 加全局锁

 flush tables with read lock ;

2). 数据备份

 mysqldump  -uroot –p1234  itcast > itcast.sql

3). 释放锁

 unlock tables ;

特点
数据库中加全局锁,是一个比较重的操作,存在以下问题:

  • 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  • 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。

在InnoDB引擎中,我们可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致性数据备份。

 mysqldump  --single-transaction  -uroot –p123456  itcast > itcast.sql

在这里插入图片描述

表级锁

介绍
表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。

对于表级锁,主要分为以下三类:

  • 表锁
  • 元数据锁(meta data lock,MDL)
  • 意向锁

表锁

对于表锁,分为两类
1.表共享读锁(read lock

  • 所有客户端都只能读数据,不能写数据

2.表独占写锁(write lock

  • 只有上锁的客户端可以读写数据,其他都不能读写数据。

读锁
在这里插入图片描述
写锁:
在这里插入图片描述
语法

加锁:lock tables 表名... read / write。
释放锁:unlock tables / 客户端断开连接释放锁。

说实话其实表锁不常用(个人感觉)

元数据锁

meta data lock , 元数据锁,简写MDL

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上

这里的元数据,可以简单理解为就是一张表的表结构, 也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的。

在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享)除EXCLUSIVE的其他元数据锁;当对表结构进行变更操作的时候,加MDL写锁(排他)EXCLUSIVE

MDL读锁:防止DDL语句,即修改表结构
MDL写锁:防止DML和DQL即增删改查

当事务执行提交后,就会释放MDL读锁

注:所有除EXCLUSIVE元数据锁,其目的都是防止表结构被修改,不管是SHARED_READ或者其他的都是这样,图片第一列是表锁,上表锁也会上一个元数据锁,表锁是防止写/读(上一小节),而元数据锁是防止DDL语句修改表结构,达到协同作用
在这里插入图片描述

意向锁

为了避免 DML 在执行时,加的行锁表锁的冲突,在 InnoDB 中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

假如没有意向锁,客户端一对表的某一行加了行锁后,客户端二想给表加表锁时,会从第一行数据,检查到最后一行数据查找是否有行锁。如果没有,则会添加表锁,如果存在,则不添加。这种方法效率非常低

有了意向锁之后,客户端一在执行 DML 操作时,会对涉及的行加行锁,同时也会对该表加上意向锁
在这里插入图片描述
而其他客户端,在对这张表加表锁的时候,会根据该表上所加的意向锁来判定是否可以成功加表锁,而不用逐行判断行锁情况了。

意向锁和表锁兼容即可加
意向锁和表锁不兼容即不可加

意向锁类型和兼容状态
分类:

  • 意向共享锁 (IS): 由语句 select ... lock in share mode(普通 select 不加锁) 添加 。 与表共享读锁 (read lock) 兼容,与表独占写(write lock)互斥。
  • 意向排他锁 (IX): 由insert、update、delete、select…for update添加 。与表锁共享锁 (read) 及排他锁 (write) 都互斥,意向锁之间不会互斥。

和我的理解一样,就是有一个意向锁,标识了整张表中行锁的状态,所以上表锁的时候,只需要检查意向锁即可判断能否加标锁

select * from score where id=1 lock in share mode; 

会给这行加上行锁的共享锁,同时为score这张表加上意向共享锁,此时可以给表加读锁,但是不能加写锁。

意向锁会在事务提交后解锁

行级锁

介绍
行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。

InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。
所以update的优化,需要加索引防止表锁

对于行级锁,主要分为以下三类:

  • 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行 updatedelete。在RC(读未提交)、RR(读已提交)隔离级别下都支持。
    在这里插入图片描述
  • 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在 RR 隔离级别下支持。
    在这里插入图片描述
  • 临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持
    在这里插入图片描述

行锁
InnoDB 实现了以下两种类型的行锁:

  • 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
  • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

两种行锁的兼容情况如下:
在这里插入图片描述
常见的SQL语句,在执行时,所加的行锁如下:
在这里插入图片描述
默认情况下,InnoDB在REPEATABLE READ(可重复读)事务隔离级别运行,InnoDB使用next-key-临键锁进行搜索和索引扫描,以防止幻读

  1. 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
  2. 对于 行锁类型:排他锁 来说InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁

间隙锁&临键锁
默认情况下,InnoDB在 REPEATABLE READ 事务隔离级别运行,InnoDB 使用 next-key 锁进行搜索和索引扫描,以防止幻读。

  • 针对唯一索引进行检索时,对不存在的记录进行等值匹配时,将会自动优化为间隙锁。
现在只有id=1,3,8...
beginupdate stu set age = 10 where id = 5;//此时没有id=5的数据
这里就不会加行锁了,而会加间隙锁
锁住3-8之间的间隙,该间隙锁不会锁38对应的记录,锁的只是间隙
此时insert into stu values(7,'ruby',18);是阻塞的,因为73-8中间,需要等待间隙锁释放
  • 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。
比如说现在有age为非唯一索引,age有1,3,7,.....
begin;
select * from stu where age = 3 lock in share mode;
由于age为非唯一索引,不确定age=3的有几个,也不确定事务未提交前,是否别的事务会插入age=3的数据
所以此时,有三个锁
1.锁住age=3这一行的行锁,共享锁S
2.锁住1-3之间间隙的间隙锁
3.锁住3-7之间的间隙锁
就是把等值数据和其旁边间隙锁住
  • 索引上的范围查询(唯一索引) ,会访问到不满足条件的第一个值为止。
现在有age 19,25;后面就没了
begin;
select * from stu where id>=19 lock in share mode;
此时会有三个锁
1.先锁19这一行的行锁
2.19-25之间的临键锁,锁25行和19-25之间的间隙
3.临键锁,锁25-正无穷之间的间隙和正无穷这个值(???有疑问)

注意:间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。

锁的释放条件

所有隐式生效的锁,都会在事务提交后解锁
所有显示上的锁,都需要自己执行解锁语句

相关文章:

MySQL进阶篇2_SQL优化、锁

文章目录 1 SQL优化1.1插入数据优化1.2主键优化页分裂页合并主键设计原则 1.3order by设计优化1.4group by设计优化小理解 1.5limit设计优化顺序IO和随机IO小疑惑 1.6count设计优化1.7update优化关于隐式事务事务的DML操作 锁全局锁表级锁表锁元数据锁意向锁 行级锁锁的释放条件…...

Yocto项目实战经验总结:从入门到高级的全面概览

本文面向开发者和实际项目经验者&#xff0c;分享经过大量实战积累的 Yocto 项目工程经验和基础技巧。本文简明但精彩&#xff0c;应用和观察相结合&#xff0c;充分适合做为全面进阶 Yocto 项目开发的实用指南。 一、入门理解&#xff1a;Yocto 是什么&#xff1f;规划如何开始…...

关于web3

主流看法&#xff0c;集合当前网络上的大部分资料的看法&#xff1f; 基于区块链运行的交易系统&#xff1f;面向的交易市场是基于世界的&#xff0c;由于将整个世界的交易联系起来&#xff0c;所以底层区块链就类似于一个非常大的分布式系统&#xff0c;由于需要在各个地区都…...

以影像为笔,劳润智在世界舞台上书写艺术之路

在光影交织中,摄影师劳润智的镜头仿佛能穿透喧嚣,捕捉人类情感最细腻的脉动。从疫情下洛杉矶裁缝日常的温馨瞬间,到象征自由与解脱的飞鸟影像,再到探索时间与空间交错的抽象作品,每一幅作品都展现了他对艺术的深度追求与对生活的温柔洞察。 劳润智的作品为他赢得了多个国际奖项…...

2025python学习笔记

一.Python语言基础入门 第一章 01.初识Python Python的起源&#xff1a; 1989年&#xff0c;为了打发圣诞节假期&#xff0c;Gudio van Rossum吉多范罗苏姆&#xff08;龟叔&#xff09;决心开发一个新的解释程序&#xff08;Python维形&#xff09;1991年&#xff0c;第一个…...

数学相关使用笔记

1、样本标准差计算步骤整理 1. 基础数据 数据样本&#xff1a;[44.530, 44.023, 43.837, 44.213, 44.498] 样本量&#xff1a;n5 2. 计算步骤 (1) 求均值 总和 44.53044.02343.83744.21344.498 221.101 均值 221.101/5 44.2202 (2) 求平方差 ① (44.530-44.2202) 0.3…...

0.环境初始化

容器化部署 Nginx 前端文件在 html\hmdp 下&#xff0c;挂载到 /usr/share/nginx/html 下 所以要求 nginx.conf &#xff1a; root /usr/share/nginx/html; index index.html; 反向代理&#xff1a;proxy_pass http://host.docker.internal:8081; listen 80; 因为容器内端…...

数仓-范式建模、维度建模、雪花模型、星型模型对比及其适用范围

1. 范式建模 定义 范式建模是一种基于关系型数据库设计的建模方法&#xff0c;遵循数据库的范式规则&#xff08;如第一范式、第二范式、第三范式等&#xff09;&#xff0c;通过消除数据冗余、规范化字段和表结构来优化存储。数据被分解为多个表&#xff0c;通过外键关系进行…...

批量导出docker镜像

#!/bin/bash # 创建备份目录 BACKUP_DIR"docker_images_single_backup" mkdir -p "$BACKUP_DIR" # 遍历所有镜像 docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" | while read -r line; do # 提取镜像名称和ID REPO_TAG$(echo …...

棒球裁判员学习指南·棒球1号位

针对棒球裁判员的规则学习与能力提升指南&#xff0c;包含系统性学习路径和实践建议&#xff0c;帮助裁判员高效掌握规则并提升执法水平&#xff1a; 一、基础规则体系构建 1. 官方规则精读 核心文件&#xff1a;完整研读《世界棒垒球联盟&#xff08;WBSC&#xff09;官方规…...

vue注册用户使用v-model实现数据双向绑定

定义数据模型 Login.vue //定义数据模型 const registerData ref({username: ,password: ,confirmPassword: })使用 v-model 实现数据模型的key与注册表单中的元素之间的双向绑定 <!-- 注册表单 --><el-form ref"form" size"large" autocompl…...

BM14 链表的奇偶重排

20250510 题目我的解法❗️问题描述&#xff1a;为什么会报 OutOfMemoryError&#xff1f;&#x1f50d;详细分析✅如何修复&#xff1f;✅推荐修改方案&#xff08;正确版本&#xff09;✅为什么这样改有效&#xff1f;&#x1f9ea;测试示例✅总结 修改 题目 我的解法 impor…...

Client 和 Server 的关系理解

client.py 和 server.py 是基于 MCP&#xff08;Multi-Component Protocol&#xff09;协议的客户端-服务端架构&#xff0c;二者的关系如下&#xff1a; 1. 角色分工 server.py&#xff1a;服务端&#xff0c;负责注册和实现各种“工具函数”&#xff08;如新闻检索、情感分…...

Checkmk实战指南:从零构建企业级监控系统

在当今复杂的IT环境中,监控系统如同运维团队的"眼睛"和"耳朵",而Checkmk正是一款能够帮助企业实现全方位监控的开源利器。本文将带您从零开始,通过8个关键步骤构建一个功能完备的监控系统,涵盖从安装部署到高级优化的完整流程。 一、为什么选择Checkm…...

多模态大模型中的视觉分词器(Tokenizer)前沿研究介绍

文章目录 引言MAETok背景方法介绍高斯混合模型&#xff08;GMM&#xff09;分析模型架构 实验分析总结 FlexTok背景方法介绍模型架构 实验分析总结 Emu3背景方法介绍模型架构训练细节 实验分析总结 InternVL2.5背景方法介绍模型架构 实验分析总结 LLAVA-MINI背景方法介绍出发点…...

车载电子电器架构 --- 汽车网关概述

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

JVM对象创建内存分配

对象创建的主要流程&#xff1a; 检查加载类–》分配内存–》初始化–》设置对象头–》实例化&#xff0c;执行init方法。 在内存分配中&#xff0c;虚拟机将为新生对象内存分配 Minor GC : 新生代垃圾收集&#xff0c;特点是频繁&#xff0c;回收速度快&#xff1b; Full GC …...

project从入门到精通(五)

目录 创建资源的基本信息 在project中创建资源工作表 ​编辑信息详解 最大单位 标准费率与加班费率 每次使用成本 成本累算 基准日历 三类资源工作表的总结——不同的资源必须要设置的属性 除了资源名称是必须设置的之外&#xff0c;剩余的资源的可设置选项如下图所…...

研发效率破局之道阅读总结(5)管理文化

研发效率破局之道阅读总结(5)管理文化 Author: Once Day Date: 2025年5月10日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...

Java常用类概述

Java常用类概述 一、字符串三剑客1. String&#xff08;不可变字符串&#xff09;2. StringBuilder&#xff08;可变&#xff0c;线程不安全&#xff09;3. StringBuffer&#xff08;可变&#xff0c;线程安全&#xff09; 二、日期时间类&#xff08;重点掌握新版API&#xff…...

202535| Kafka架构与重要概念+幂等性+事务

好的&#xff01;以下是关于 Kafka 架构 以及其 重要概念 的详细介绍&#xff0c;结合 Mermaid 图形 和 表格&#xff0c;帮助你更好地理解各个概念的关系和作用。 Kafka 架构与重要概念 Kafka 是一个分布式消息系统&#xff0c;广泛应用于日志收集、流处理、事件驱动架构等场…...

MySQL 索引和事务

目录 一、MySQL 索引介绍 1、索引概述 2、索引作用 3、索引的分类 &#xff08;1&#xff09;普通索引 &#xff08;2&#xff09;唯一索引 &#xff08;3&#xff09;主键索引 &#xff08;4&#xff09;组合索引&#xff08;最左前缀&#xff09; &#xff08;5&…...

IPFS与去中心化存储:重塑数字世界的基石

引言 在数据爆炸式增长的数字时代&#xff0c;中心化存储的弊端日益凸显——数据垄断、隐私泄露、单点故障等问题频发。IPFS&#xff08;InterPlanetary File System&#xff09; 作为一种去中心化存储协议&#xff0c;正与区块链技术共同推动一场存储革命。本文将深入解析IPF…...

Web3 学习全流程攻略

目录 🧭 Web3 学习全流程攻略 🌱 第一阶段:打好基础(Web3 入门) 🧠 目标: 📚 学习内容: ✅ 推荐资源: 🧑‍💻 第二阶段:技术栈搭建(成为 Web3 开发者) 🧠 目标: 📚 学习内容: ✅ 推荐资源: 🌐 第三阶段:构建完整 DApp(去中心化应用)…...

AUTODL Chatglm2 langchain 部署大模型聊天助手

资源申请 注册登录 进入下面的链接 AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDLAutoDL为您提供专业的GPU租用服务&#xff0c;秒级计费、稳定好用&#xff0c;高规格机房&#xff0c;7x24小时服务。更有算法复现社区&#xff0c;一键复现算法。https://autodl.com/ho…...

牛客练习赛138

牛客练习赛138 A.小s的签到题 思路&#xff1a;过题人数最多的就是签到题 #include <bits/stdc.h> using namespace std; typedef long long ll; typedef pair<int, char> PII;bool cmp(PII a, PII b) {return a.first > b.first; }void solve() {int n;cin …...

【脑机接口临床】脑机接口手术的风险?脑机接口手术的应用场景?脑机接口手术如何实现偏瘫康复?

脑机接口的应用 通常对脑机接口感兴趣的两类人群&#xff0c;一类是适应症患者 &#xff0c;另一类是科技爱好者。 1 意念控制外部设备 常见的外部设备有&#xff1a;外骨骼、机械手、辅助康复设备、电刺激设备、电脑光标、轮椅。 2 辅助偏瘫康复或辅助脊髓损伤患者意念控制…...

普通IT的股票交易成长史--股价起伏的真相-缺口(2)

声明&#xff1a;本文章的内容只是自己学习的总结&#xff0c;不构成投资建议。价格行为理论学习可参考简介中的几位&#xff0c;感谢他们的无私奉献。 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&#xff01;&#xff01;&#xff01;&…...

基于NI-PXI的HIL系统开发

基于NI-PXI平台的汽车电控单元HIL系统开发全解析 引言&#xff1a;HIL系统如何成为汽车电控开发的“效率倍增器”&#xff1f; 某车企通过基于NI-PXI的HIL系统&#xff0c;将悬架控制器的测试周期从3个月压缩至2周&#xff0c;故障检出率提升65%。这背后是硬件在环技术对汽车电…...

IOC和Bean

IOC IOC将对象的创建&#xff0c;依赖关系的管理和生命周期的控制从应用程序代码中解耦出来了 IOC容器的依赖注入(DI) 在程序运行过程中动态的向某个对象中注入他所需要的其他对象 依赖注入是基于反射实现的 Spring IOC 容器使用的是Map&#xff08;concorrentMap&#xff…...

助力你的Neovim!轻松管理开发工具的魔法包管理器来了!

在现代编程环境中&#xff0c;Neovim 已经成为许多开发者的编辑器选择。而针对 Neovim 的各种插件与功能扩展&#xff0c;则是提升开发体验的重要手段。今天我们要介绍的就是一个强大而便捷的开源项目——mason.nvim&#xff0c;一个旨在简化和优化 Neovim 使用体验的便携式包管…...

AI与机器人学:从SLAM到导航的未来

AI与机器人学&#xff1a;从SLAM到导航的未来 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AI与机器人学&#xff1a;从SLAM到导航的未来摘要引言技术路线对比1. 传感器融合架构&#xff1a;纯激光 vs 多模态2. …...

C++学习之模板初阶学习

今天我们来学习C中模板的学习。但是模板是C中比较难的部分&#xff0c;因此本节我们直接出相对比较初阶的部分。 目录 泛型编程 函数模板 函数模板格式 函数模板的原理 函数模板的特性 函数模板的实例化 模板参数的匹配原则 类模板 类模板定义格式 类模板实例化 泛型…...

专业级软件卸载工具:免费使用,彻底卸载无残留!

在数字生活节奏日益加快的今天&#xff0c;我们的电脑就像每天都在"吃进"各种软件。但您是否注意到&#xff0c;那些看似消失的程序其实悄悄留下了大量冗余文件&#xff1f;就像厨房角落里积攒的调味瓶空罐&#xff0c;日积月累就会让系统变得"消化不良"。…...

JSON|cJSON 介绍以及具体项目编写

一、JSON介绍 JSON&#xff08;JavaScript Object Notation 即JavaScript对象表示法&#xff09;是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。 JSON是一种数据交换格式.JSON独立于编程语言(你不必学习JavaScript).JSON表达数据的方式对通…...

Cell | 大规模 单细胞图谱 揭示非小细胞肺癌抗PD-1治疗后的免疫微环境异质性

–https://doi.org/10.1016/j.cell.2025.03.018 A single-cell atlas reveals immune heterogeneity in anti-PD-1-treated non-small cell lung cancer 留意更多内容&#xff1a;组学之心 研究简介 背景与问题 非小细胞肺癌&#xff08;NSCLC&#xff09;术后复发率高。新…...

光流 | 基于深度学习的光流估计算法汇总,原理,公式,流程图,代码

基于深度学习的光流算法 一、光流估计的基本原理二、基于深度学习的光流估计算法1. **FlowNet系列**2. **FlowNet 2.0**3. **PWC-Net**4. **RAFT(Recurrent All-Pairs Field Transformers)**5. **LiteFlowNet系列**三、算法流程图示例FlowNet2.0架构PWC-Net金字塔处理流程四、…...

常见的算法介绍

算法概述线性回归(Linear Regression)线性回归是一种通过属性的线性结合来进行预测的线性模型, 其目的是找到一条直线, 一个平面或者更高维的超平面, 使预测值和真实值之间的误差最小化逻辑回归(Logistic Regression)逻辑回归是一种分类模型, 入二分类公式 P ( Y 1 ∣ X ) e …...

【基于 LangChain 的异步天气查询1】异步调用 Open-Meteo API 查询该城市当前气温

目录 一、功能概述 二、文件结构 三、城市天气实时查询&#xff08;运行代码&#xff09; weather_runnable.py main.py 运行结果 四、技术亮点 五、使用场景 一、功能概述 它实现了以下主要功能&#xff1a; 用户输入地点&#xff08;城市名&#xff09; 构造提示词…...

深入解析JavaScript变量作用域:var、let、const全攻略

在JavaScript中&#xff0c;变量作用域是一个核心概念&#xff0c;它决定了变量的可访问性和生命周期。理解变量作用域对于编写清晰、高效且无错误的代码至关重要。本文将深入探讨JavaScript中不同类型的变量声明方式&#xff08;var、let、const等&#xff09;&#xff0c;分析…...

C33-函数嵌套及编码实战

我们以一个编程题目的实践来学习此部分内容 题目:输入四个数,以函数的方式找出最大值 思维:使用两个数找出较大值→较大值与第三个数比较得出新的较大值→新的较大值与第四个数比较得出最大值 代码 #include <stdio.h>//内层函数的封装int GetMaxFromTwoNums(int a,int…...

clangd与clang-tidy

Clangd是基于Clang的Language Server&#xff0c;主要用于提供代码补全、跳转定义、错误提示等IDE功能。而Clang-Tidy则是静态代码分析工具&#xff0c;用于检查代码中的潜在问题&#xff0c;比如风格违规、潜在bug等。 clangd 核心工作原理 1. 基于编译器的精准解析 底层引擎…...

【Linux】冯诺依曼体系结构和操作系统的理解

目录 冯诺依曼体系结构一个例子来深入理解 初识操作系统操作系统的作用设计操作系统的目的操作系统之上和之下分别有啥 管理的精髓&#xff0c;先描述&#xff0c;再组织 冯诺依曼体系结构 我们知道&#xff0c;计算机这个东西发明出来就是帮助人们快速解决问题的。那如果我们想…...

Windows系统Jenkins企业级实战

目标 在Windows操作系统上使用Jenkins完成代码的自动拉取、编译、打包、发布工作。 实施 1.安装Java开发工具包&#xff08;JDK&#xff09; Jenkins是基于Java的应用程序&#xff0c;因此需要先安装JDK。可以从Oracle官网或OpenJDK下载适合的JDK版本。推荐java17版本&#x…...

服务预热原理

Java、Spring、Springboot工程启动后&#xff0c;第一次访问比较慢&#xff0c;而从第二次访问开始就快很多&#xff0c;这通常是由以下几个原因导致的&#xff1a; 类加载与初始化开销 类加载过程&#xff1a;Java程序在启动时需要加载大量的类文件到内存中&#xff0c;包括…...

Python核心编程深度解析:作用域、递归与匿名函数的工程实践

引言 Python作为现代编程语言的代表&#xff0c;其作用域管理、递归算法和匿名函数机制是构建高质量代码的核心要素。本文基于Python 3.11环境&#xff0c;结合工业级开发实践&#xff0c;深入探讨变量作用域的内在逻辑、递归算法的优化策略以及匿名函数的高效应用&#xff0c…...

python环境搭建和pycharm的安装配置以及使用face_recognition与cv2

一.python环境的搭建: 1.下载python&#xff08;这里以python3.11为例&#xff09; step 1&#xff1a;打开下载网址&#xff1a;https://www.python.org/downloads/windows/ step 2&#xff1a;我这里选着python3.11.9的版本 2. 安装我就不说了,网上很多 二.pycharm的安装…...

养生:为健康生活筑牢根基

养生并非遥不可及的目标&#xff0c;而是贯穿于日常生活的点滴之中。从饮食、运动到心态调节&#xff0c;每一个环节都对我们的健康有着重要意义。以下为你详细介绍养生的实用策略&#xff0c;助力你开启健康生活模式。 饮食养生&#xff1a;科学搭配&#xff0c;滋养生命 合…...

linux-----------Ext系列⽂件系统(上)

1.理解硬盘 1-1 磁盘、服务器、机柜、机房 机械磁盘是计算机中唯⼀的⼀个机械设备 磁盘--- 外设 慢 容量⼤&#xff0c;价格便宜 1-2 磁盘物理结构 1-3 磁盘的存储结构 扇区&#xff1a;是磁盘存储数据的基本单位&#xff0c;512字节&#xff0c;块设备 如何定位⼀个扇区呢…...

ts装饰器

TypeScript 装饰器是一种特殊类型的声明&#xff0c;能够被附加到类声明、方法、访问符、属性或参数上。它本质上是一个函数&#xff0c;会在运行时被调用&#xff0c;并且被装饰的声明信息会作为参数传递给装饰器函数。 装饰器的分类 类装饰器 类装饰器作用于类构造函数&…...