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

Mysql存储引擎、锁机制

Mysql存储引擎

InnoDB​(MySQL 5.5 及以后版本中的默认存储引擎)

​​事务支持​​:支持 ​​ACID 事务​​,适合需要高可靠性的场景(如支付、订单)。
​​锁机制​​:默认使用 ​​行级锁​​,支持高并发操作。
​​外键约束​​:支持外键,保证数据完整性。
​​崩溃恢复​​:通过 ​​redo log​​ 和 ​​undo log​​ 实现崩溃后的数据恢复。
​​存储结构​​:数据按主键聚簇索引存储,二级索引保存主键值。
​​适用场景​​:OLTP(在线事务处理)、高并发读写、需要事务的场景。

MyISAM​

事务支持​​:​​不支持事务​​,无法保证数据一致性。
​​锁机制​​:​​表级锁​​,并发写入性能差。
​​存储结构​​:数据文件(.MYD)、索引文件(.MYI)、表结构文件(.frm)分离。
​​特性​​:支持全文索引(FULLTEXT)、压缩表、空间索引(GIS)。
​​适用场景​​:读多写少(如日志分析)、静态数据、不需要事务的场景。

Memory(HEAP)​

数据存储​​:数据完全存储在内存中,重启后数据丢失。
​​锁机制​​:表级锁,并发性能一般。
​​特性​​:支持哈希索引和B树索引,查询速度极快。
​​适用场景​​:临时表、缓存表、快速查询中间结果。

Archive​

存储方式​​:数据高度压缩存储,适合归档。
​​写入性能​​:仅支持插入和查询,不支持删除和更新。
​​适用场景​​:日志归档、历史数据存储。

CSV​

存储方式​​:数据以纯文本CSV格式存储。
​​特性​​:不支持索引,适合导入/导出数据。
​​适用场景​​:与外部系统交换数据。

Blackhole​

特性​​:接收数据但不存储,直接丢弃。常用于数据复制的中继。

核心区别对比​

在这里插入图片描述

如何选择存储引擎

​​需要事务​​:必须选 ​​InnoDB​​。
​​读多写少​​:若不需要事务,可选 ​​MyISAM​​(注意表锁问题)。
​​临时数据/缓存​​:使用 ​​Memory​​,但需注意数据易失性。
​​归档数据​​:选择 ​​Archive​​ 或 InnoDB 压缩表。
​​高并发写入​​:优先 InnoDB(行级锁)。

操作示例​

​​查看表的存储引擎​​:

SHOW TABLE STATUS LIKE 'table_name';

​​修改表的存储引擎​​:

ALTER TABLE table_name ENGINE = InnoDB;

​​设置默认存储引擎​​(需在 my.cnf 中配置):

[mysqld]
default-storage-engine = InnoDB

总结

InnoDB​​ 是 MySQL 默认引擎,适用于大多数场景,尤其是需要事务和高并发的场景。
​​MyISAM​​ 在只读或低并发写入场景下仍有价值,但逐渐被 InnoDB 替代。
其他引擎(如 Memory、Archive)在特定场景下能发挥独特优势。

MySQL 的锁机制

锁的粒度分类​

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

表级锁(Table-Level Lock)​

定义​​:直接锁定整张表,粒度最粗,并发度最低。
​​适用引擎​​:MyISAM、Memory、CSV 等。
​​特点​​:
​​共享锁(S)​​:允许其他事务读表,但禁止写。
​​排他锁(X)​​:禁止其他事务读写表。
​​操作示例​​:

-- MyISAM 隐式加表锁(自动管理)
SELECT * FROM table_name;          -- 加共享锁
INSERT INTO table_name VALUES (...); -- 加排他锁

页级锁(Page-Level Lock)​

定义​​:锁定数据页(一组连续的行),粒度介于表锁和行锁之间。
​​适用引擎​​:BDB(已被 MySQL 废弃)。

行级锁(Row-Level Lock)​

定义​​:锁定单行或多行数据,粒度最细,并发度最高。
​​适用引擎​​:InnoDB。
​​特点​​:
​​共享锁(S Lock)​​:允许其他事务读,但禁止修改该行。
​​排他锁(X Lock)​​:禁止其他事务读写该行。
​​操作示例​​:

-- 显式加行锁(InnoDB)
SELECT * FROM table_name WHERE id = 1 FOR SHARE;   -- 共享锁
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;  -- 排他锁

​​子类型​​:
记录锁(Record Lock)​​:锁定索引中的一条记录。
​​间隙锁(Gap Lock)​​:锁定索引记录之间的间隙(防止幻读)。
​​临键锁(Next-Key Lock)​​:记录锁 + 间隙锁(锁定左开右闭区间)。
​​插入意向锁(Insert Intention Lock)​​:在插入前标记意向,避免间隙锁冲突。

InnoDB 的行级锁实现​
记录锁(Record Lock)​

作用​​:锁定索引中的一条记录。
​​示例​​:SELECT * FROM user WHERE id = 1 FOR UPDATE;

间隙锁(Gap Lock)​

锁定范围​​:索引记录之间的 ​​间隙​​(即两个索引值之间的区间)。
作用​​:锁定索引记录之间的间隙,防止其他事务插入数据。
特点​:
不锁定现有记录​​:仅锁定间隙,不影响已存在的记录修改或删除。
​​仅作用于非唯一索引​​:
—唯一索引的等值查询(如 WHERE id=10)​​不会加间隙锁​​(因唯一性保证不会有重复值)。
—唯一索引的范围查询(如 WHERE id > 10)仍会加间隙锁。
​​示例​​:

-- 表结构:id(主键), age(普通索引)
-- 数据:id=1(age=10), id=2(age=20)-- 事务 A(RR 隔离级别)
SELECT * FROM users WHERE age = 15 FOR UPDATE;
-- 锁定间隙 (10,20),阻止插入 age=15 的记录-- 事务 B 尝试插入
INSERT INTO users (age) VALUES (15); -- 被阻塞
临键锁(Next-Key Lock)​

间隙锁是临键锁的组成部分,临键锁 = 行锁(Record Lock) + 间隙锁(Gap Lock)。当临键锁仅锁定间隙(不锁定具体行)时,退化为纯间隙锁。
定义​​:行锁 + 间隙锁,锁定左开右闭区间(例如 (1,5])。
​​目的​​:解决幻读问题(在 ​​RR 隔离级别​​ 下,InnoDB 对范围查询默认使用 ​​临键锁​​(Next-Key Lock),其锁定范围为 ​​左开右闭区间​​。)。
适用于所有索引​​:包括主键索引、唯一索引和普通索引。
​​示例​​:

-- 表结构:id(主键), age(普通索引)
-- 数据:id=1(age=10), id=2(age=20)-- 事务 A(RR 隔离级别)
SELECT * FROM users WHERE age > 10 AND age <= 20 FOR UPDATE;
-- 加临键锁 (10,20],阻止插入 age ∈ (10,20] 的数据-- 事务 B 尝试插入或修改
INSERT INTO users (age) VALUES (15); -- 被阻塞
UPDATE users SET age = 15 WHERE id = 1; -- 被阻塞(修改为 age=15
插入意向锁(Insert Intention Lock)​

作用​​:在插入数据前设置,表示事务想在某个间隙插入数据,与间隙锁冲突。

按锁的行为分类​

共享锁(Shared Lock, S Lock; 又称读锁)​

​​作用​​:允许其他事务读,但禁止修改锁定的数据。
​​使用场景​​:读操作(如 SELECT … LOCK IN SHARE MODE或SELECT … FOR SHARE)。

​​语法​说明​
SELECT … LOCK IN SHARE MODE旧版语法(MySQL 5.7 及之前版本常用),用于为读取的数据行加共享锁。
SELECT … FOR SHARE新版语法(MySQL 8.0 引入),替代 LOCK IN SHARE MODE,功能相同,但支持更多扩展选项(如 NOWAIT、SKIP LOCKED)。
​​兼容性​​:多个共享锁可共存。

排他锁(Exclusive Lock, X Lock;又称写锁、独占锁)​

​​作用​​:禁止其他事务读写锁定的数据。
​​使用场景​​:写操作(如 SELECT … FOR UPDATE、INSERT/UPDATE/DELETE)。
​​兼容性​​:与其他锁互斥。

意向锁(Intention Lock)​

​​目的​​:快速判断表级锁和行级锁的冲突,避免逐行检查。
​​类型​​:
​​意向共享锁(IS)​​:事务打算对某些行加共享锁。
​​意向排他锁(IX)​​:事务打算对某些行加排他锁。
​​兼容性​​:
在这里插入图片描述

按锁的实现方式分类​

乐观锁​

乐观锁则基于一种乐观的态度来处理并发问题,它假设数据冲突将不会频繁发生,因此在数据读取时不会加锁,而是在更新数据时检查数据是否被其他事务修改过。
​​实现​​:通过版本号或时间戳(应用层控制)。
适用场景​​:读多写少,冲突概率低。
​​示例​​:

UPDATE product SET stock = stock - 1, version = version + 1 
WHERE id = 1 AND version = 5;
工作机制:
数据读取:

事务首先读取需要修改的数据及其版本号(或时间戳)。这个版本号是在数据库中额外维护的一个字段,用于跟踪数据的更新情况。

数据操作:

事务在本地对读取的数据进行修改,但不立即更新到数据库中。

提交前的检查:

在提交事务之前,事务会再次查询数据库中对应数据的版本号,并将其与第一步读取的版本号进行比较。

数据更新:

如果版本号相同,说明数据在读取和提交之间没有被其他事务修改过,事务可以安全地更新数据,并将版本号增加(或更新时间戳)。
如果版本号不同,说明数据在读取和提交之间已经被其他事务修改过,此时当前事务可以选择重试(重新读取数据并尝试更新)、回滚或向应用层报告错误。

提交事务:

如果数据更新成功,事务将提交,所做的修改将被保存到数据库中。

悲观锁​

悲观锁是假定冲突将频繁发生,因此在操作数据之前先锁定数据。在MySQL中,悲观锁可以通过行级锁(InnoDB存储引擎提供)或表级锁(MyISAM或InnoDB在某些情况下)来实现。
​​适用场景​​:写多读少,冲突概率高。
实现​​:
1.使用SELECT … FOR UPDATE):
这是最常用的悲观锁实现方式。当事务使用SELECT … FOR UPDATE语句读取记录时,MySQL会对这些记录加锁,其他事务必须等待锁释放才能修改这些记录。

START TRANSACTION;
SELECT * FROM accounts WHERE id = 100 FOR UPDATE;
-- 在这里进行更新操作
UPDATE accounts SET balance = balance - 100 WHERE id = 100;
COMMIT;

注意:FOR UPDATE必须在一个事务中使用,否则会立即释放锁。
2.使用表锁
虽然表锁不是悲观锁的最佳实践(因为它会锁定整个表),但在某些情况下仍然可以使用。通过LOCK TABLES和UNLOCK TABLES命令可以显式地锁定和解锁表。

LOCK TABLES accounts WRITE;
-- 在这里进行更新操作
UPDATE accounts SET balance = balance - 100 WHERE id = 100;
UNLOCK TABLES;

索引类型与加锁规则​

在 ​​可重复读(RR)隔离级别​​ 下,SELECT * FROM users WHERE age = 25 FOR UPDATE; 的加锁行为取决于 age 字段的索引类型和数据分布。以下是不同场景下的详细分析:

age 是普通索引(非唯一索引)​

​​数据分布假设​​:
表中存在 age 为 20、25、30 的记录(假设 age 索引结构如下):
age索引树:20 → 25 → 30
​​加锁范围​​:
​​行锁(Record Lock)​​:锁定所有 age=25 的记录。
​​间隙锁(Gap Lock)​​:锁定 age=25 前后的间隙:
左间隙:(20, 25)
右间隙:(25, 30)
​​Next-Key Lock​​:实际加锁为 ​​左开右闭区间​​(InnoDB 默认使用 Next-Key Lock),即:
(20, 25](锁定 age=25 的行及其左间隙)
(25, 30)(锁定右间隙,防止插入新的 age=25)
​​效果​​:
其他事务无法插入或修改 age=25 的记录,也无法在 (20, 30) 区间插入 age=25 的新数据。
彻底避免幻读。

age 是唯一索引(Unique Index)​

​​数据分布假设​​:
age 是唯一索引,表中存在 age=25 的记录。
​​加锁范围​​:
​​仅行锁​​:锁定 age=25 的记录。
​​无间隙锁​​:唯一索引的唯一性保证了其他事务无法插入 age=25 的新数据,因此无需加间隙锁。
​​例外情况​​:
如果 age=25 ​​不存在​​,则会锁定该值所在的间隙。例如:
现有 age=20 和 age=30,则锁定 (20, 30) 间隙,阻止插入 age=25。

age 无索引​

​​加锁范围​​:
​​全表扫描​​:所有记录的行锁 + 所有间隙的间隙锁(即锁全表)。
​​效果​​:其他事务无法插入或修改表中任何数据,性能极差。
​​建议​​:
必须为 WHERE 条件字段添加索引,避免全表锁。

InnoDB 特有的锁​

自增锁(AUTO-INC Lock)​

作用​​:
确保自增列(AUTO_INCREMENT)的值连续且唯一。
​​模式​​:
​​传统模式​​:表级锁,事务完成后释放(影响并发插入性能)。
​​连续模式​​(MySQL 8.0 默认):轻量级锁,仅保证自增值的连续性。

隐式锁(Implicit Lock)​

触发条件​​:插入操作时,对新插入的数据自动加隐式排他锁。
​​作用​​:避免其他事务在插入完成前访问未提交的数据。

死锁

死锁(Deadlock)是指两个或多个事务相互等待对方释放锁资源,导致无限阻塞的现象。MySQL 中死锁通常由 ​​行级锁(Record Lock)​​、​​间隙锁(Gap Lock)​​ 和 ​​Next-Key Lock​​ 的冲突引起,尤其在 ​​可重复读(RR)​​ 隔离级别下更易发生

导致死锁的锁类型​

锁类型​描述​死锁场景​
行锁(Record Lock)​锁定某一行记录,其他事务无法修改或删除。多个事务以不同顺序请求同一批行锁时,形成循环等待。
间隙锁(Gap Lock)​锁定索引记录之间的间隙,防止其他事务插入数据。多个事务在相同间隙范围内插入数据,互相等待对方释放间隙锁。
Next-Key Lock​行锁 + 间隙锁,锁定一个左开右闭的区间(如 (5,10])。事务以相反顺序锁定不同范围的 Next-Key Lock,形成环路。
插入意向锁(Insert Intention Lock)​一种特殊的间隙锁,表示事务准备在某个间隙插入数据。多个事务在同一间隙的不同位置插入数据,互相等待对方的间隙锁释放。

典型死锁场景与原理​

行锁冲突(交叉更新顺序)​

场景​​:
事务 A 和事务 B 以相反顺序更新两条记录。
​​示例​​:

-- 事务 A
UPDATE users SET name = 'A' WHERE id = 1;  -- 锁定 id=1 的行
UPDATE users SET name = 'B' WHERE id = 2;  -- 尝试锁定 id=2 的行(被事务 B 阻塞)-- 事务 B
UPDATE users SET name = 'B' WHERE id = 2;  -- 锁定 id=2 的行
UPDATE users SET name = 'A' WHERE id = 1;  -- 尝试锁定 id=1 的行(被事务 A 阻塞)

死锁原因​​:
事务 A 持有 id=1 的行锁,等待 id=2 的行锁;事务 B 持有 id=2 的行锁,等待 id=1 的行锁,形成循环依赖。

间隙锁冲突(并发插入相同间隙)​

​​场景​​:
事务 A 和事务 B 在同一个间隙内插入数据,但插入位置不同。
​​示例​​:

-- 表结构:id 是主键,当前存在 id=10id=20 的记录。
-- 事务 A
INSERT INTO users (id) VALUES (15);  -- 尝试获取间隙 (10,20) 的插入意向锁-- 事务 B
INSERT INTO users (id) VALUES (18);  -- 尝试获取间隙 (10,20) 的插入意向锁

​​死锁原因​​:
事务 A 和事务 B 都试图在间隙 (10,20) 插入数据。
插入意向锁与已存在的间隙锁(如 Next-Key Lock)冲突,导致互相等待。

Next-Key Lock 冲突(范围查询与插入)​

场景​​:
事务 A 范围查询加 Next-Key Lock,事务 B 在范围内插入数据。
​​示例​​:

-- 事务 A(RR 隔离级别)
SELECT * FROM users WHERE id > 10 AND id < 20 FOR UPDATE;  -- 加 Next-Key Lock (10,20]-- 事务 B
INSERT INTO users (id) VALUES (15);  -- 尝试获取插入意向锁,被事务 A 阻塞-- 事务 A 再次操作
INSERT INTO users (id) VALUES (15);  -- 尝试获取插入意向锁,被事务 B 阻塞

死锁原因​​:
事务 A 持有 (10,20] 的 Next-Key Lock,事务 B 等待插入;事务 A 随后尝试插入同一条数据,被事务 B 阻塞,形成死锁。

死锁产生条件​

互斥​​:资源被独占。
​​请求与保持​​:事务持有锁并请求新锁。
​​不可剥夺​​:锁只能由持有者释放。
​​循环等待​​:事务间形成环形等待。

死锁处理​

检测​​:InnoDB 使用等待图(wait-for graph)检测死锁。
​​解决​​:强制回滚代价较小的事务。

查看死锁日志​​:
SHOW ENGINE INNODB STATUS;  -- 查看 LATEST DETECTED DEADLOCK 部分

查找输出中的 LATEST DETECTED DEADLOCK 部分,这里会显示导致死锁的具体事务信息,包括涉及的表、行、锁和事务 ID。
​​关键信息解析​​:
​​TRANSACTION​​:参与死锁的事务 ID 和状态。
​​HOLDS THE LOCK(S)​​:事务当前持有的锁类型和范围。
​​WAITING FOR THIS LOCK​​:事务正在等待的锁类型和范围。
​​WE ROLL BACK TRANSACTION​​:被回滚的事务 ID。

查询MySQL整体的锁状态:
show status like 'innodb_row_lock_%';

在这里插入图片描述
Innodb_row_lock_current_waits:当前正在阻塞等待锁的事务数量。
Innodb_row_lock_time:MySQL启动到现在,所有事务总共阻塞等待的总时长。
Innodb_row_lock_time_avg:平均每次事务阻塞等待锁时,其平均阻塞时长。
Innodb_row_lock_time_max:MySQL启动至今,最长的一次阻塞时间。
Innodb_row_lock_waits:MySQL启动到现在,所有事务总共阻塞等待的总次数。

使用 INFORMATION_SCHEMA 表获取详细信息:

可以查询 INFORMATION_SCHEMA 表来获取当前进行的事务和连接信息。例如,使用以下 SQL 语句获取活动中的事务信息:

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
查询进程列表

使用 SHOW PROCESSLIST 命令可以看到当前所有连接和执行中的 SQL 语句:

SHOW PROCESSLIST;

输出将包括每个连接的线程 ID、USER、HOST、DB、COMMAND、TIME、STATE 和 INFO 字段,其中 INFO 字段显示正在执行的 SQL 语句。

终止导致死锁的事务

一旦确认了具体的事务和 SQL 语句,下一步是终止这个事务。
根据 SHOW ENGINE INNODB STATUS 和 SHOW PROCESSLIST 得到的 ID,可以使用 KILL 命令终止相应的连接。

-- 从SHOW PROCESSLIST结果中获取具体线程ID
KILL 12345;

避免死锁​

保持事务简短,减少锁持有时间。
按固定顺序访问表和行。
合理设计索引,减少锁范围。
使用 SELECT … FOR UPDATE 时明确指定索引。

相关文章:

Mysql存储引擎、锁机制

Mysql存储引擎 InnoDB​&#xff08;MySQL 5.5 及以后版本中的默认存储引擎&#xff09; ​​事务支持​​&#xff1a;支持 ​​ACID 事务​​&#xff0c;适合需要高可靠性的场景&#xff08;如支付、订单&#xff09;。 ​​锁机制​​&#xff1a;默认使用 ​​行级锁​​…...

UVA1537 Picnic Planning

目录 题目算法标签: 最小生成树, k r u s k a l kruskal kruskal重构树, 树形 d p dp dp思路重构树代码 题目 UVA1537 Picnic Planning 算法标签: 最小生成树, k r u s k a l kruskal kruskal重构树, 树形 d p dp dp 思路 将 1 1 1号点设置为终点, 然后执行重构树计算度数…...

通过AWS Console连接服务器,简化运维过程

简单通过AWS Console连接您的Linux服务器 本文作者: 封磊 Eclicktech SA | AWS Community Builder DevTool | AWS UGL | 亚马逊云科技云博主 阿里云&InfoQ&CSDN签约作者 文章目录 简单通过AWS Console连接您的Linux服务器本文作者: 封磊Eclicktech SA | AWS Community …...

公交实时查询小程序功能点开发

线路查询&#xff1a;用户可输入公交线路号码&#xff0c;小程序实时显示该线路车辆位置与发车信息&#xff0c;能一键切换行驶方向&#xff0c;助用户依实时情况选合适候车站点。站点查询&#xff1a;输入车站信息&#xff0c;小程序呈现经过该站所有公交线路及公交信息&#…...

nginx配置集群服务器中的tcp负载均衡器

文章目录 前言1. Ubuntu下nginx安装2. nginx的tcp负载配置 前言 假设一台机器支持两万的并发量&#xff0c;现在我们需要保证八万的并发量。首先想到的是升级服务器的配置&#xff0c;比如提高 CPU 执行频率&#xff0c;加大内存等提高机器的物理性能来解决此问题。但是单台机…...

Qt/C++开发监控GB28181系统/获取设备信息/设备配置参数/通道信息/设备状态

一、前言 设备注册成功后&#xff0c;接下来要做的就是获取设备的信息&#xff0c;尤其是通道信息&#xff0c;根据国标协议&#xff0c;永远只有两个层级&#xff0c;一个是设备&#xff0c;然后就是设备下面多个通道&#xff0c;设备编码在整个系统中唯一&#xff0c;通道编…...

Linux系统基础:基础指令简介(网络概念部分)

简介&#xff1a;Linux 是一种开源的类 Unix 操作系统内核&#xff0c;由 Linus Torvalds 于 1991 年首次发布。经过多年发展&#xff0c;它已成为服务器、嵌入式设备和个人计算机领域的重要操作系统。 网络基础概念 初始协议 简单来说&#xff0c;协议是一种约定&#xff0…...

labview项目文件架构

为了使 LabVIEW 项目更具可扩展性和易于维护&#xff0c;合理规划和设计项目文件结构是非常重要的。 以下是一些基于行业经验和最佳实践的建议&#xff1a; 1. ### 文件夹层次划分 将不同的功能模块分开存储在一个清晰的分层目录结构中是一个常见的做法。通常情况下&#xff…...

nuxt项目中引入并配置 iview

安装iview npm install iview --save注&#xff1a;想要加入其它的配置&#xff0c;可以在 nuxt.config.js 的 plugins 配置项中加入&#xff0c;同时在 plugins 文件夹下加入引入逻辑。 在nuxt.config.js文件中写&#xff1a; {src: ~plugins/iview, ssr: true}同时新建 plugi…...

Origin绘图操作:点线图符号显示不全解决方法

一、问题说明 在用origin绘制点线图时&#xff0c;图表刻度线处的点符号显示不完全&#xff0c;如图所示&#xff1a; 二、解决方法 方法一&#xff1a;调整坐标轴刻度&#xff0c;使其能够显示全部数据点。 方法二&#xff1a;有时为了图表美观&#xff0c;则不对坐标轴刻…...

【进程与线程】

文章目录 一、实验目的二、实验内容与设计思想实验内容设计思路 三、实验代码实现四、总结 一、实验目的 1.深刻理解进程和线程的概念&#xff0c;掌握线程与进程在组成成分上的差别&#xff1b; 2.进一步认识并发执行的实质。 二、实验内容与设计思想 实验内容 用pipe()创…...

项目实战-飞机大战【补档】

和项目实战-贪吃蛇大作战【补档】-CSDN博客一样&#xff0c;这也是一个我在大一和网友完成的项目的补档。Dont waste your youth—time flies. 目录 1.工具&环境 2.项目简介 3.需求文档 4.流程图 5.产品原型图 6.可行性分析 7.源代码 8.实战效果 ​编辑 9.心得…...

算法基础学习|02归并排序——分治

一、思路 &#xff08;1&#xff09;确定分界点&#xff1a;mid(lr)/2 ——这里和快排不同 &#xff08;2&#xff09;递归排序&#xff08;left right&#xff09; &#xff08;3&#xff09;归并——合二为一 时间复杂度nlogn 二、题目练习 三、模板 归并排序 …...

测试基础笔记第十六天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、UI自动化介绍1.认识UI自动化测试2.实施UI自动化测试前置条件3.UI自动化测试执行时机4.UI自动化测试核心作用和劣势 二、认识Web自动化测试工具-Selenium021.Sel…...

Android项目中使用ComposeUI

首先确认项目环境kotlin版本&#xff0c;以下是本机的版本 使用命令 ./gradlew -version 这里kotlin 版本是1.5.31 然后查看build.gradle sdk版本 这里是32 属于低版本 然后需要添加以下配置 buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersio…...

springboot中有关数据库信息转换的处理

现代项目一般都是前后端分离的&#xff0c;前端只负责展示数据&#xff0c;不负责对数据处理&#xff0c;所以所有数据处理工作都由后端进行 比如在仿京东中的status&#xff0c;审核信息展示&#xff0c;数据库中是以0/1显示&#xff0c;但是前端需要以"审核/未审核&quo…...

HHsuite同源序列搜索数据库构建

HHsuite 可用的数据库格式简介 HHsuite 是用于蛋白质序列比对和同源性检测的工具套件,它使用特定的数据库格式以实现高效的数据存储和快速的检索。HHsuite 常用的数据库格式主要基于 FFINDEX(Flat-File Index),这是一种简单而高效的文件索引系统,它将数据文件(如蛋白质序…...

大模型推理:Qwen3 32B vLLM Docker本地部署

Qwen3基础知识 此次Qwen3开源8个模型&#xff08;MOE架构&#xff1a;Qwen3-235B-A22B、Qwen3-30B-A3B&#xff0c;Dense架构&#xff1a;Qwen3 0.6B/1.7B/4B/8B/14B/32B&#xff09;&#xff0c;新版本的Qwen3特性包括&#xff1a; 支持混合思维模式&#xff0c;即推理/非推…...

第十六届蓝桥杯 2025 C/C++B组 第二轮省赛 全部题解(未完结)

目录 前言&#xff1a; 试题A&#xff1a;密密摆放 试题B&#xff1a;脉冲强度之和 试题C&#xff1a;25之和 试题D&#xff1a;旗帜 试题H&#xff1a;破解信息 前言&#xff1a; 这是我后续刷到的第二轮省赛的题目&#xff0c;我自己也做了一下&#xff0c;和第一轮省赛…...

域名转移:什么是转移码/EPP码/授权码?

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…...

Android 系统发展史

Android 1.0&#xff1a;2008年9月 全球第一台安卓设备是 HTC Dream Google地图、YouTube、HTML浏览器、Gmail、即使消息、短信、彩信、日历等 Android Market&#xff08;应用程序商店&#xff09; Android 1.1&#xff1a;2009年2月&#xff08;Petit Four 花色小蛋糕&am…...

Python中的defaultdict方法

文章目录 核心特点基本语法常见使用场景1. 分组数据&#xff08;默认值为列表&#xff09;2. 计数&#xff08;默认值为整数&#xff09;3. 集合操作&#xff08;默认值为集合&#xff09;4. 嵌套字典 注意事项与普通字典对比总结1. 键&#xff08;Key&#xff09;的类型2. 值&…...

Android启动应用时屏蔽RecyclerView滑动,延时后再允许滑动,Kotlin

Android启动应用时屏蔽RecyclerView滑动&#xff0c;延时后再允许滑动&#xff0c;Kotlin var bCanScrollVertically falselifecycleScope.launch(Dispatchers.Default) {repeatOnLifecycle(Lifecycle.State.CREATED) {Log.d(TAG, "Lifecycle.State.CREATED")delay(…...

2025运维工程师面试题1(答案在后一张)

一、逻辑思维能力考核&#xff1a; 问题1&#xff1a; 3个人去投宿&#xff0c;一晚30元三个人每人掏了10元凑够30元交给了老板后来老板说今天优惠只要25元就够了&#xff0c;拿出5元命令服务生退还给他们&#xff0c;服务生偷偷藏起了2元&#xff0c;然后&#xff0c;把剩下…...

在网页中使用【LaTeX 数学公式块】的完整步骤总结

以下是在网页中使用 LaTeX 数学公式块的完整步骤总结&#xff0c;记录如何让网页正确渲染 LaTeX 数学表达式&#xff08;如 \(H(X) -\sum p(x) \log p(x)\) 这样的公式&#xff09;&#xff1a; ✅ 使用 LaTeX 数学公式块的完整步骤&#xff08;以 KaTeX 为例&#xff09; &am…...

新人销售如何找精准客户?

深入了解自身产品或服务。 清晰掌握产品优势、应用场景和解决的问题&#xff0c;比如销售办公软件&#xff0c;要熟知其提升办公效率的具体功能&#xff0c;以此定位需求客户。 利用社交媒体平台。 像领英可完善资料&#xff0c;加入行业群组分享内容吸引潜在客户&#xff1…...

【Unity】使用Socket建立客户端和服务端并进行通信的例子

Socket服务端: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; public class SocketServer { public static Socket listenSocket;//监听Socket public static List<Socket>…...

为什么要学习《易经》?

《易经》精华解读&#xff1a;变易之道与人生智慧 《易经》&#xff08;《周易》&#xff09;是中国最古老的经典之一&#xff0c;被誉为“群经之首&#xff0c;大道之源”。它不仅是占卜之书&#xff0c;更是一部哲学经典&#xff0c;揭示了宇宙运行的规律和人生处世的智慧。…...

13.继承、重载、重写、多态、抽象类、接口、final、Static的学习

一、继承 继承&#xff1a;你继承谁你就是谁&#xff0c;继承是一种严格的父子关系 &#xff08;在父类里面抽取的属性和方法一定是所有子类所共有&#xff09; &#xff08;Student继承Person&#xff0c;那么Student就是人&#xff09; UML: 类图&#xff08;描述类和类之间的…...

SpringBoot Actuator未授权访问漏洞的全面解析与解决方案

引言 SpringBoot Actuator 作为应用监控与管理的核心组件,为开发者提供了丰富的系统自省和运维能力。然而,其默认配置中可能存在的未授权访问漏洞,已成为企业安全防护的潜在风险。本文将从漏洞原理、影响范围、检测方法到解决方案,系统性地剖析该问题,并提供覆盖开发、运维…...

使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(1)

背景 用户在WEB页面上点击按钮&#xff0c;服务端需要执行一系列操作&#xff0c;该操作系列步骤较多且耗时长&#xff0c;为了更好的给用户浏览体验&#xff0c;需要在每进行一个步骤由服务端推送消息给客户端&#xff08;浏览器&#xff09;&#xff0c;避免一个长时间的操作…...

一网统管建设组织保障分工常见表

在 “一网统管” 建设进程中,强有力的组织保障体系与各业务部门间的紧密分工协作是确保建设成效的关键。 从组织保障层面来看,需建立专门的 “一网统管” 建设领导小组,由政府高层领导担任组长,各关键业务部门负责人作为组员,以此强化对整体建设工作的统筹规划与组…...

JVM | CMS垃圾收集器详解

目录 CMS垃圾回收器简介 为什么CMS图中初始标记的阶段是单线程&#xff1f;为啥不多线程&#xff1f;当然现在默认多线程了。 CMS的两种模式与一种特殊策略 Backgroud CMS 记忆集 卡表 ForeGroud CMS CMS的标记压缩算法 三色标记 &#xff08;便于理解而被后人提出&am…...

android开发中的多线程、数据存储同步功能实现方案和应用场景

在Android开发中&#xff0c;多线程、数据存储与同步功能有多种实现方案&#xff0c;以下是详细介绍及其应用场景&#xff1a; 多线程 实现方案&#xff1a; Thread类与Runnable接口&#xff1a;通过继承Thread类并重写run方法&#xff0c;或实现Runnable接口并将其传入Threa…...

【C++初阶】--- 模板进阶

1.非类型模板参数 • 模板参数分类类型形参与非类型形参。 • 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 • 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参…...

数据库所有知识

# 第一章 数据库-理论基础 ## 1.1 什么是数据库 数据&#xff1a; 描述事物的符号记录&#xff0c; 可以是数字、 文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;它们都可以经过数字化后存入计算机。 数据库&#xff1a; 存储数据的仓库&#xff0c…...

docker部署的Nextcloud,处于维护模式,如何解决

Nextcloud 在升级后卡在维护模式&#xff0c;以下是针对 Docker 部署的解决方案&#xff1a; 1. 通过 OCC 命令强制关闭维护模式 进入 Nextcloud 容器内部执行命令&#xff1a; # 替换 nextcloud 为你的容器名称 docker exec -it --user www-data nextcloud php occ maintena…...

mongoose插入文档,字段类型, 字段验证, 删除文档,更新文档,读取文档,查询文档的条件控制 ,字段筛选,数据排序,数据截取

、Mongoose 中与 文档操作&#xff08;插入、查询、更新、删除&#xff09;及其相关功能&#xff08;字段类型、验证、条件筛选、排序、分页等&#xff09;相关示例&#xff1a; &#x1f4cb; 一、字段类型定义&#xff08;Schema Types&#xff09; const mongoose require…...

源码编译安装LAMP

一&#xff1a;LAMP概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP…...

C++每日训练 Day 18:构建响应式表单与数据验证(初学者友好)

&#x1f4d8; 本篇目标&#xff1a;在前几日协程与事件驱动机制基础上&#xff0c;构建一个响应式表单系统&#xff0c;实现用户输入的异步验证与反馈。通过协程挂起/恢复机制&#xff0c;简化异步逻辑&#xff0c;提升代码可读性。 &#x1f501; 回顾 Day 17&#xff1a;响应…...

Linux环境变量以及进程虚拟地址原理

目录 一、介绍进程优先级 1.什么是优先级 2.为什么会有优先级 3.Linux中的优先级是怎么确定的 1&#xff09;查看Linux中的优先级 2&#xff09;计算优先级和更改优先级 二、环境变量 1.什么是环境变量 2.环境变量有什么作用 3.环境变量怎么做到的 1&#xff09;查看系统已有的…...

基于非递归求解的汉诺塔超级计算机堆栈与数据区设计方案

基于非递归求解的汉诺塔超级计算机堆栈与数据区设计方案 一、设计背景与目标 汉诺塔问题存在非递归直接求解方法&#xff0c;相较于递归法具有明确移动规律和潜在性能优势。本设计旨在利用非递归求解规律&#xff0c;优化汉诺塔超级计算机的堆栈与数据区结构&#xff0c;降低…...

【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso)

【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件&#xff08;需要依赖qemu-aarch64、不需要重新安装iso&#xff09; qemu提供了运行ARM虚拟机的方法 具体的操作方式就是建立一个硬盘img 然后通过iso安装到img 最后再运行img即可 这种方式教程很多 很简单 …...

CISC与RISC详解:定义、区别及典型处理器

一、CISC&#xff08;复杂指令集计算机&#xff09; Complex Instruction Set Computer 核心思想&#xff1a;通过设计复杂的指令&#xff0c;减少程序指令数量&#xff0c;以硬件复杂度换取编程便利性。 主要特点&#xff1a; 指令复杂度高&#xff1a; 单条指令可完成多步操…...

数据库中DDL、DML、DCL的区别是什么?

数据库中DDL、DML、DCL的区别是什么&#xff1f; 在数据库的使用过程中&#xff0c;SQL&#xff08;结构化查询语言&#xff09;常常被用来执行不同的操作&#xff0c;主要分为三类&#xff1a;DDL&#xff08;数据定义语言&#xff09;、DML&#xff08;数据操纵语言&#xf…...

【东枫电子】AI-RAN:人工智能 - 无线接入网络

太原市东枫电子科技有限公司&#xff0c;翻译 文章目录 1.概述1.1 什么是AI-RAN&#xff1f;1.2 为什么是AI-RAN&#xff1f;1.3 AI-RAN有哪些好处&#xff1f;1.4 为什么 AI-RAN 会给通信服务提供商 (CoSP) 带来变革&#xff1f;1.5 AIRAN 的构建模块是什么&#xff1f; 2. 参…...

实习技能记录【5】-----项目中消息传递到ui层的方法

代码 while (1){osEvent evt;evt osMailGet(ui_msg_mailbox, 0);if (evt.status osEventMail){UI_MSG_APP_T *msg (UI_MSG_APP_T *)evt.value.p;if (msg->cmd_type CMD_TYPE_INNER){if (msg->cmd_code CMD_CODE_INNER_REFRESH_NOW){lv_obj_invalidate(lv_scr_act()…...

4.29【Q】paraCompute

还是同样的要求&#xff0c;我要写实验报告&#xff0c;如何组织描述运行时间&#xff0c;加速比&#xff0c;效率等随数据规模&#xff0c;进程数&#xff0c;线程数变化的语言和逻辑&#xff0c;从而显得不冗余和精简&#xff1f;为我生成合理排版&#xff0c;布局的文字&…...

什么是布林带?

什么是布林带&#xff1f; 布林带是约翰布林格在20世纪80年代开发的一种广泛使用的技术分析工具。布林带由价格图表上的三条线组成&#xff1a;中轨、上轨和下轨。中轨通常是20天简单移动平均线&#xff08;SMA&#xff09;&#xff0c;代表资产在此期间的平均价格。上轨和下轨…...

爬虫学习笔记(四)---request入门

例1 例1&#xff1a;写一个爬取百度搜索页面的程序&#xff0c;以搜索一个喜欢的明星为例&#xff08;如在搜索框中输入周杰伦&#xff09; 正常搜索 页面 爬虫思路&#xff1a; 1.用一个query变量&#xff0c;在控制台输入的方式更加灵活的输入想爬取的明星的百度搜索页面 …...