MySQL 进阶 - 2 ( 9000 字详解)
一: SQL 优化
1.1 插入数据
1.1.1 批量插入
单条 INSERT 语句执行时,需经历语法解析、事务提交、磁盘 I/O 等多个步骤。批量插入将多条数据合并为一条 SQL,能够减少网络通信和事务开销。
-- 单条插入(低效)
INSERT INTO tb_user (name, age) VALUES ('张三', 25);
INSERT INTO tb_user (name, age) VALUES ('李四', 30);-- 批量插入(高效)
INSERT INTO tb_user (name, age) VALUES ('张三', 25),('李四', 30);
一次插入语句插入的数据建议控制在 500~1000 ,避免单条 SQL 过大导致内存溢出或锁竞争,如果数据量太大可通过分批次提交(如每 1000 条提交一次)平衡性能与资源消耗。
1.1.2 手动提交事务
默认情况下,每条 INSERT 语句会自动提交事务,频繁提交事务会导致事务日志频繁刷盘,增加 I / O 压力。
START TRANSACTION; -- 开启事务
INSERT INTO tb_user (name, age) VALUES ('张三', 25);
INSERT INTO tb_user (name, age) VALUES ('李四', 30);
COMMIT; -- 手动提交事务
此时事务日志刷盘次数从 N 次(N 为插入条数)降低为 1 次,适用于高并发写入场景。
1.1.3 主键顺序插入
InnoDB 表的数据按主键顺序组织为 B+ 树结构。顺序插入主键值可减少页分裂和碎片,提升写入效率。所以如果没有业务强需求,建议使用 BIGINT 自增主键,分布式场景可使用雪花算法生成有序主键。
1.1.4 大批量插入场景的优化
适用于一次性插入数十万甚至百万级数据的场景,比如在历史数据迁移场景下可以使用。核心方法是使用 LOAD DATA INFILE 指令直接加载数据文件,绕过 SQL 解析和事务机制。
- 首先启动本地文件加载开关:
# 客户端连接时添加参数 --local-infile
mysql --local-infile -u root -p# 在 MySQL 会话中开启全局开关
SET GLOBAL local_infile = 1;
- 接着准备一下数据文件 xxx.csv,文件格式如下:
张三,25
李四,30
- 执行 LOAD 指令
LOAD DATA LOCAL INFILE '/path/to/data.csv' INTO TABLE tb_user
FIELDS TERMINATED BY ',' -- 字段分隔符
LINES TERMINATED BY '\n' -- 行分隔符
(name, age); -- 目标表字段
1.2 主键优化
在 InnoDB 存储引擎中,数据按主键顺序物理存储,聚集索引的叶子节点直接包含行数据,所有二级索引的叶子节点存储主键值。如果主键是无序的就需要付出一些代价:页分裂与页合并。
页分裂:新数据插入时,目标页已满且主键值不连续,InnoDB 将当前页分裂为两页,重新分配数据并调整 B+ 树结构,这会增加磁盘 I/O 操作,还会导致数据页碎片化,降低查询效率,举个例子:假设页1已满(主键10, 20, 30),插入主键15(无序),此时就会发生页分裂:
分裂前:页1 [10,20,30]
分裂后:页1 [10,15], 页2 [20,30]
页合并:删除记录后,如果页的空间利用率低于 MERGE_THRESHOLD(默认50%),InnoDB 会尝试与相邻页合并以优化空间。
原则 | 说明 | 推荐方案 | 注意事项 |
---|---|---|---|
优先使用短主键 | 主键长度直接影响索引树层级和存储空间。更短的主键可减少二级索引体积,提升查询效率。 | 自增主键、雪花算法 ID | 避免使用 UUID(16字节)或长字符串,因其占用空间大且无序。 |
保证顺序插入 | 主键值按顺序递增写入,避免页分裂和磁盘碎片,显著提升写入性能。 | AUTO_INCREMENT 自增主键 | 分布式场景可用雪花算法,避免因主键无序导致的性能下降。 |
禁止修改主键 | 修改主键需同步更新所有二级索引中的旧主键值,导致高并发下锁竞争和大量 I/O 开销。 | 业务设计时隔离主键与业务逻辑字段 | 若必须修改主键,建议通过新增记录实现,而非直接逻辑删除或者新增。 |
1.3 oder by 优化
在 MySQL 中,ORDER BY 的排序操作通过以下两种方式实现:
- Using filesort:通过排序缓冲区进行额外排序,效率较低。
- Using index:直接利用索引的有序性返回结果,无需额外排序,效率高。
所以我们可以通过为排序字段建立合适的索引来优化 oder by 排序的执行效率,但是要注意:如果 order by 字段全部使用升序排序或者降序排序就都会走索引,但是如果一个字段升序排序,另一个字段降序排序,此时就都不会走索引,当排序字段方向不一致时,需创建指定方向的联合索引。
-- 示例:创建支持混合排序的索引
CREATE INDEX idx_age_asc_phone_desc ON tb_user(age ASC, phone DESC);
-- 有效查询
EXPLAIN SELECT age, phone FROM tb_user ORDER BY age ASC, phone DESC;
-- 无效查询(索引方向不匹配)
EXPLAIN SELECT age, phone FROM tb_user ORDER BY age DESC, phone ASC;
所以我们可以通过添加索引的方式对 oder by 进行优化,多字段排序的适合也要遵循最左前缀法则,尽量使用覆盖索引避免回表查询,
1.4 group by 优化
同样的,group by 也可以通过索引来提高执行效率,在分组操作时,索引的使用也是满足最左前缀法则的
1.5 limit 优化
使用 LIMIT 进行深度分页时如 LIMIT 9,000,000, 10,MySQL 需要先扫描并排序前 9,000,010 条数据,最后实际上只返回最后 10 条,前 9,000,000 条都会被丢弃,即使有索引也需要完整遍历索引树完成排序,造成大量的 I / O 和 CPU 资源浪费,优化的核心思路是通过覆盖索引避免回表查询,减少需要处理的数据量。
1.6 count 优化
MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count() 的时候会直接返回这个数,效率很高,而 InnoDB 在执行 count() 时,需要把数据一行一行地从引擎里面读出来,然后累计计数。优化的核心思路是自己计数,如创建 key-value 表存储在内存或硬盘,或者是用 redis
-
count(字段):没有 not null 约束的话,InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为 null,不为 null,计数累加;有 not
null 约束的话,InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加 -
count(主键):InnoDB引擎会遍历整张表,把每行的主键 id 值都取出来,返回给服务层,服务层拿到主键后,直接按行进行累加,因为主键不可能为空
-
count(1):InnoDB 引擎遍历整张表,但不取值。服务层对于返回的每一层,放一个数字 1 进去,直接按行进行累加
-
count(*):InnoDB 引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加
按效率排序:count(字段) < count(主键) < count(1) < count(*),所以尽量使用 count(*)
1.7 update 优化
对于 update 的优化,要避免行锁升级为表锁,因为 InnoDB 的行锁是针对索引加的锁,不是针对记录加的锁,如果你的索引失效了,在全表扫描时为避免逐行加锁的资源消耗,行锁会自动升级为表级锁。
-- 案例1:使用主键索引(行锁),这句由于 id 有主键索引,所以只会锁这一行;
UPDATE user SET balance = 100 WHERE id = 5; -- 仅锁定 id=5 的行-- 案例2:使用无索引字段(表锁),这句由于 name 没有索引,所以会把整张表都锁住进行数据更新,解决方法是给 name 字段添加索引
UPDATE user SET balance = 200 WHERE phone = '13800138000'; -- 锁定整个表
二: 视图
视图本身并不存储任何物理数据,而是通过保存一个预先编写的 SELECT 查询语句,在每次访问视图时动态执行该查询并实时生成结果集。
-- 创建视图,create or replace 表示创建或者替换视图,如果视图已经存在就替换,不存在就新建,view 后面的 stu_v_1 是视图名称,as 后面跟着的是视图的逻辑,接着把数据存入虚拟表 stu_v_1 中
create or replace view stu_v_1 as select id, name from student where id <= 10;-- 查询视图
show create view stu_v_1;
select * from stu_v_1;-- 修改视图
create or replace view stu_v_1 as select id, name, no from student where id <= 10;
alter view stu_v_1 as select id, name from student where id <= 10;-- 删除视图
drop view if exists stu_v_1;/* */
2.1 检查选项
WITH CHECK OPTION 是视图定义中的关键子句,用于强制约束通过视图修改的数据必须符合视图的查询条件,为了确定检查的范围,mysql 提供了两个选项:CASCADED 和 LOCAL,默认值为 CASCADED。
CREATE VIEW active_users AS
SELECT * FROM users WHERE status = 1
WITH CHECK OPTION; -- 因为此时视图查询的是 status = 1 的数据,所以此时禁止插入 status≠1 的数据
对比项 | CASCADED(级联检查) | LOCAL(本地检查) |
---|---|---|
触发条件 | 当前视图或任何依赖视图定义了 WITH CASCADED CHECK OPTION | 当前视图定义了 WITH LOCAL CHECK OPTION |
检查范围 | 当前视图及其所有上游视图的查询条件(无论上游是否定义检查选项) | 仅检查当前视图和显式定义检查选项的依赖视图 |
行为特点 | 严格模式:强制所有层级条件必须满足 | 宽松模式:仅验证有明确约束的层级 |
适用场景 | 需要确保数据在所有视图层级中都合法(例如多层视图嵌套时,要求所有层级条件同时生效) | 允许部分层级条件不强制检查(例如仅确保当前视图条件合法,不追溯未定义检查的依赖视图) |
2.2 视图更新
视图需要满足以下所有条件才能执行 INSERT / UPDATE / DELETE 操作:
- 不使用聚合函数
- 不使用集合操作 UNION 或者 UNION ALL
- 不使用 GROUP BY 或 HAVING 子句
- 不使用去重 DISTINCT
视图的作用:
作用类型 | 描述 | 实现价值 |
---|---|---|
简化复杂性 | 将高频或复杂的查询逻辑封装为视图,用户可直接操作视图而无需重复编写完整查询条件。 | 提升开发效率,避免代码冗余,降低使用门槛。 |
权限控制 | 通过视图限制用户只能访问特定行或列(如 WHERE status=1),弥补数据库原生行列权限的不足。 | 实现行级或列级数据权限隔离,保障敏感数据安全性。 |
结构解耦 | 视图作为逻辑层抽象,屏蔽底层表结构变化(如字段重命名、表拆分),仅需维护视图定义一致性。 | 降低表结构变更对上层应用的影响,增强系统可维护性。 |
-- 1.为了保证数据库表的安全性,开发人员在操作tb_user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段。
create view tb user view as select id,name,profession, age,gender,status,createtime from tb_user;
select *from tb user view;-- 2.查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。
create view tb_stu_course_view
select s.name student_name, s.no student_no, c.name course_name
from student s, stuent_course sc, course c
where s.id = sc.studentid and sc.courseid = c.id;-- 以后每次只需要进行查询视图即可
select * from tb_stu_course_view;
三:存储过程
存储过程是事先经过编译并存储在数据库中的一段 SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,存储过程完全在数据库服务器内存中运行,与应用层代码解耦,这对于提高数据处理的效率是有好处的。
特点 | 描述 | 核心价值 |
---|---|---|
模块化封装与逻辑复用 | 将复杂业务逻辑封装为独立模块,支持多次调用,避免代码冗余。 | 提升开发效率,增强代码可维护性。 |
参数化交互与数据返回 | 支持输入参数、输出参数及返回值,实现灵活的业务逻辑控制与结果传递。 | 适应动态业务需求,增强程序灵活性。 |
批量执行与性能优化 | 通过单次调用执行多条 SQL 语句,减少应用层与数据库层的网络交互次数。 | 降低网络延迟,提升高并发场景执行效率。 |
-- 存储过程基本语法
-- 创建
-- 创建一个名为 p1 的存储过程,() 表示无输入参数。
-- BEGIN ... END 包裹存储过程的主体逻辑,相当于代码块的大括号 {}。
create procedure p1()
beginselect count(*)from student;
end;-- 调用
call p1();-- 查看数据库 itcast 中所有存储过程和函数的元信息。
select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'itcast';
show create procedure p1;-- 删除
drop procedure if exists p1;
3.1 变量
3.1.1 系统变量
系统变量是 MySQL 服务器提供的一组预定义变量,这些变量控制着 MySQL 服务器的行为和配置。与用户自定义的变量不同,系统变量由 MySQL 本身定义并维护,且它们的作用范围可以分为两类:全局变量 GLOBAL 和会话变量 SESSION 。这两种变量的主要区别在于它们的作用范围和生命周期。
全局变量影响MySQL服务器的整个实例,适用于所有用户和会话。更改全局变量后,所有新创建的会话都将使用更新后的值,但已存在的会话将继续使用它们各自的会话变量值,直到下次连接时使用新的全局值。而会话变量仅影响当前用户会话。它们在会话开始时初始化,直到会话结束才会消失。一旦会话结束,所有会话变量的设置将被丢弃。
-- 查看系统变量
-- 检索当前会话的所有系统变量
show session variables;
show session variables like 'auto%';-- 检索整个服务器实例的所有系统变量
show glabal variables ;
SELECT @@global.autocommit; -- 查看全局的 autocommit 变量值
SELECT @@session.autocommit; -- 查看当前会话的 autocommit 变量值-- 临时启用当前会话的自动提交
set session autocommit = 1;insert intto course(id, name) values (6, 'ES');-- 设置全局的自动提交为关闭
set global auto commit = 0;
3.1.2 用户自定义变量
用户定义变量:用户可以在 MySQL 会话中根据自己的需求随意定义的变量,在用的时候通过“@变量名”使用就可以。这些变量的作用域仅限于当前数据库连接,并且在连接结束时自动销毁。
用户定义变量不需要预先声明或初始化,当第一次使用时,如果该变量没有已经赋值,则返回的结果为 NULL。用户定义变量可以存储任何类型的数据,包括字符串、数字、日期等。对于相同的变量名,后续的赋值操作会覆盖前一个值。
-- 变量:用户变量
-- 赋值
set @myname = 'itcast';
-- 这种 := 方式保守一点
set @myage := 10;select @mycolor := 'red';
select count(*) into @mycount from tb_user;-- 输出为 NULL,因为没有提取赋值,但是可以直接使用
select @abc;
3.1.3 局部变量
局部变量是 MySQL 中在特定代码块(如存储过程、函数或触发器)内定义的变量,其作用域仅限于定义它的代码块。与用户定义变量不同,局部变量需要显式声明,并且只能在声明它的 BEGIN … END 块中使用。
BEGINDECLARE a INT;BEGINDECLARE b INT; -- 只能在内部块中访问DECLARE c INT; -- 只能在内部块中访问-- 从 student 表查询总记录数(COUNT(*)),并将结果存入局部变量 c。SELECT COUNT(*) INTO c FROM student;SET a = 10; -- 可以访问外部块的变量 aEND;SET b := 20; -- 错误!无法访问内部块的变量 b
END;
3.2 if 判断
create procedure p3()
begindeclare score int default 58;declare result varchar(10);-- 如果 score ≥ 85,将 result 赋值为 '优秀'if score >= 85 thenset result :='优秀';elseif score >= 60 thenset result :='及格';elseset result :='不及格';end if;select result;
end;
3.3 参数 (in, out, inout)
类型 | 含义 | 备注 |
---|---|---|
IN | 该类参数作为输入,也就是需要调用时传入值 | 默认 |
OUT | 该类参数作为输出,也就是该参数可以作为返回值 | |
INOUT | 既可以作为输入参数,也可以作为输出参数 |
-- 根据传入(in)参数score,判定当前分数对应的分数等级,并返回(out)
-- score >= 85分,等级为优秀。
-- score >= 60分 且 score < 85分,等级为及格
-- score < 60分,等级为不及格。
create procedure p3(in score int, out result varchar(10))
beginif score >= 85 thenset result :='优秀';elseif score >= 60 thenset result :='及格';elseset result :='不及格';end if;select result;
end;-- 将传入的200分制的分数,进行换算,换算成百分制,然后返回分数 --> inout
create procedure p5(inout score double)
beginset score := score * 0.5;
end;set @score = 198;
call p5(score);
select @score;
3.4 case
-- case
-- 根据传入的月份,判定月份所属的季节(要求采用case结构)
-- 1-3月份,为第一季度
-- 4-6月份,为第二季度
-- 7-9月份,为第三季度
-- 10-12月份,为第四季度create procedure p6(in month int)
begin declare result varchar(10);case when month >= 1 and month <= 3 thenset result := '第一季度';when month >= 4 and month <= 6 thenset result := '第二季度';when month >= 7 and month <= 9 thenset result := ' 第三季度';when month >= 10 and month <= 12 thenset result := '第四季度';elseset result := '非法参数';end case;select concat('你输入的月份为:', month, ',所属季度为:', result);
end;
3.5 循环
3.5.1 while
-- while计算从1累加到 n 的值,n 为传入的参数值。
-- A.定义局部变量,记录累加之后的值;
-- B.每循环一次,就会对 n 进行减1,如果 n 减到0,则退出循环-- 定义一个输入参数 n 类型为整数 INT
create procedure p7(in n int)
begindeclare total int default 0;while n>0 doset total := total + nset n:=n-1;end while;select total;
end;
call p7( n: 100);
3.5.2 repeat
repeat 就相当于 do while,先进行循环一次再判断,满足条件则退出
-- while计算从1累加到 n 的值,n 为传入的参数值。
-- A.定义局部变量,记录累加之后的值;
-- B.每循环一次,就会对 n 进行减1,如果 n 减到0,则退出循环create procedure p8(innint)
begindeclare total int default 0;repeatset total := total + n;set n := n - 1;until n <= 0end repeat;select total;
end;call p8( n: 10);
call p8( n: 100);
3.6 游标 - cursor
游标是数据库编程中用于逐行处理查询结果集的一种机制,类似于程序中的“指针”或“迭代器”。它允许开发者在存储过程或函数中,对 SQL 查询返回的多行数据进行逐行操作,实现复杂业务逻辑。
-- 创建名为 p11 的存储过程,接收一个输入参数 uage(整数类型)
create procedure p11(in uage int)
begin -- 声明变量:用于临时存储游标获取的数据declare uname varchar(100); -- 存储用户姓名declare upro varchar(100); -- 存储用户专业-- 声明游标 u_cursor:关联查询语句,获取年龄<=uage的用户姓名和专业declare u_cursor cursor for select name, profession from tb_user where age <= uage; -- 查询条件:年龄小于等于输入参数-- 删除已存在的表 tb_user_pro(避免重复数据)drop table if exists tb_user_pro;-- 创建新表 tb_user_pro,用于存储处理结果create table if not exists tb_user_pro(id int primary key auto_increment, -- 自增主键name varchar(100), -- 用户姓名字段profession varchar(100) -- 专业字段);-- 打开游标:执行关联的查询语句,加载结果集到内存open u_cursor;-- 开启无限循环(⚠️ 存在问题:未设置退出条件,会导致死循环,这里我为了方便就这样写了)while true do-- 从游标中获取下一行数据,存入变量 uname 和 uprofetch u_cursor into uname, upro;-- 将获取的数据插入新表 tb_user_pro-- NULL 表示 id 自增,无需手动赋值insert into tb_user_pro values(null, uname, upro);end while;-- 关闭游标(⚠️ 实际因死循环永远不会执行到这里)close u_cursor;
end;
相关文章:
MySQL 进阶 - 2 ( 9000 字详解)
一: SQL 优化 1.1 插入数据 1.1.1 批量插入 单条 INSERT 语句执行时,需经历语法解析、事务提交、磁盘 I/O 等多个步骤。批量插入将多条数据合并为一条 SQL,能够减少网络通信和事务开销。 -- 单条插入(低效) INSERT…...
Devops之GitOps:什么是Gitops,以及它有什么优势
GitOps 定义 GitOps 是一种基于版本控制系统(如 Git)的运维实践,将 Git 作为基础设施和应用程序的唯一事实来源。通过声明式配置,系统自动同步 Git 仓库中的期望状态到实际运行环境,实现持续交付和自动化运维。其核心…...
VSCode和Fitten Code
提示:本文为学习记录,若有错误,请联系作者。 文章目录 一、离线安装二、在线安装总结 一、离线安装 访问 Open VSX 镜像站 打开 https://open-vsx.org,搜索 Fitten Code 点击“从VSIX安装”,选择下载的VSIX即可。安装…...
在 Visual Studio Code 中安装 Python 环境
在 Visual Studio Code 中安装 Python 环境 1. 安装 Visual Studio Code 首先,下载并安装 Visual Studio Code(VS Code): 下载链接:Visual Studio Code 官网安装步骤:按照下载页面的说明进行安装。 2. …...
[问题帖] vscode 重启远程终端
原理 有的时候,在vscode 远程ssh连接到服务器的时候,可能遇到需要重启终端才能生效的配置,比如add group的时候,而此时无论你是关闭vscode终端重启,还是reload窗口都是没用的。 因为不管你本地是否连接了远程的vscode服…...
PostgreSQL技术大讲堂 - 第86讲:数据安全之--data_checksums天使与魔鬼
PostgreSQL技术大讲堂 - 第86讲,主题:数据安全之--data_checksums天使与魔鬼 1、data_checksums特性 2、避开DML规则,嫁接非法数据并合法化 3、避开约束规则,嫁接非法数据到表中 4、避开数据检查,读取坏块中的数据…...
No staged files match any configured task
我在拉取一个新项目的时候,进行 git commit 的时候就出现了这个问题 然后我现在来说一下我出现这个问题的解决思路 我们点击 “显示命令输出” 我们把第二行的错误 subject may not be empty [subject-empty] 复制搜索一下 这是其他人写的 博客:subje…...
Sqlite3 查看db文件
以下是一些 SQLite3 常用命令的整理,涵盖数据库操作、表管理、数据查询等场景: 1. 数据库连接与退出 打开/创建数据库:sqlite3 filename.db # 打开或创建数据库文件退出 SQLite3 命令行:.exit # 退出 .quit …...
【leetcode hot 100 152】乘积最大子数组
错误解法:db[i]表示以i结尾的最大的非空连续,动态规划:dp[i] Math.max(nums[i], nums[i] * dp[i - 1]); class Solution {public int maxProduct(int[] nums) {int n nums.length;int[] dp new int[n]; // db[i]表示以i结尾的最大的非空连…...
微信小程序实时日志记录-接口监控
文章目录 微信小程序如何抓取日志,分析用户异常问题可查看用户具体页面行为操作web体验分析 腾讯小程序平台,提供了非常好用的,。 web分析工…...
【C++刷题】二叉树基础OJ题
📝前言说明: 本专栏主要记录本人的基础算法学习以及刷题记录,使用语言为C。 每道题我会给出LeetCode上的题号(如果有题号),题目,以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…...
CSS高级技巧
目录 一、精灵图 二、字体图标 三、CSS制作三角形 四、CSS用户界面样式 1、鼠标样式 cursor 2、轮廓线 outline 3、防止拖拽文本域 resize 五、vertical-align 属性 六、溢出的文字省略号显示 1、单行文本溢出显示省略号 2、多行文本溢出显示省略号 七、常见布局技…...
70. 爬楼梯:动态规划
题目来源 70. 爬楼梯 - 力扣(LeetCode) 题目描述 思路 1.观察每个较少的台阶的方法 2.dp[0,1,2,3,5,8,13]---->dp[i]表示爬上第i阶的方法数 3.观察dp:dp[i]dp[i-1]dp[i-2]; 代码 public int climbStairs(int n) {int[] dp new int…...
使用治疗前MR图像预测脑膜瘤Ki-67的多模态深度学习模型
大家好,我是带我去滑雪! 脑膜瘤是一种常见的脑部肿瘤,Ki-67作为肿瘤细胞增殖的标志物,对于评估肿瘤的生物学行为、预后以及治疗方案的制定具有至关重要的作用。然而,传统的Ki-67检测依赖于组织学切片和免疫组化染色等方…...
Skynet.socket 函数族使用详解
目录 Skynet.socket 函数族使用详解核心功能分类一、TCP 连接管理1. 监听端口2. 建立连接3. 关闭连接 二、数据读写操作1. 阻塞式读取2. 写入数据2.1 socket.write(fd, data) 的返回值2.2 示例代码2.3 关键注意事项2.4 与其他函数的区别2.5 底层原理2.6 总结 三、UDP 处理1. 创…...
Python signal 模块详解:优雅处理异步事件
诸神缄默不语-个人技术博文与视频目录 在 Linux 或类 Unix 系统中,信号(Signal)是一种用于进程间通信的机制,允许操作系统或其他进程向目标进程发送异步通知。 Python 的 signal 模块提供了对这些信号的访问和处理能力࿰…...
[LeetCode 189] 轮转数组
[LeetCode 189] 轮转数组 题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 示例 2: 输入:nums [-1,-100,3,99], k 2 …...
【Qt】qDebug() << “中文测试“; 乱码问题
环境 Qt Creator版本:4.7.1 编译器:MSVC2015_32bit 解法一 在.pro文件中添加 msvc:QMAKE_CXXFLAGS -execution-charset:utf-8注意: 1、需要清理项目,并重新qmake,然后构建。 测试项目下载:https://do…...
解析Java根基:Object类核心方法
Object类常见方法解析 在Java编程中,Object类是所有类的根类,它包含了许多实用的方法,这些方法在不同的场景下发挥着重要作用。下面我们来详细了解一下Object类中的一些常见方法。 1. toString方法 toString方法是用于将对象转换为字符串表…...
最近在工作中感受到了设计模式的重要性
之前了解设计模式:只是应付一下面试 在之前一年多的工作中也没遇到使用场景 最近在搭建验证环境的时候,才发现这玩意这么重要 首先是设计模式的使用场景一定是在很复杂繁琐的场景下进行的 之所以说是复杂/繁琐的场景,因为一些场景也许逻辑不难…...
Docker 镜像、容器与数据卷的高效管理:最佳实践与自动化脚本20250411
Docker 镜像、容器与数据卷的高效管理:最佳实践与自动化脚本 引言 在现代软件开发中,容器化技术正变得越来越重要。Docker 作为容器化的代表工具,在各大企业中得到了广泛的应用。然而,随着容器化应用的增多,如何高效…...
[UEC++]UE5C++各类变量相关知识及其API(更新中)
基础变量 UE自己定义的目的:1.跨平台;2.兼容反射;3.方便宏替换 FString 基础赋值与初始化 遍历与内存 迭代器访问 清除系列操作 合并 插入与移除 RemoveFromStart是从开头看,没有则移除失败返回false; RemoveFromEnd是…...
C++中的设计模式
设计模式是软件工程中用于解决常见问题的可复用解决方案。它们提供了一种标准化的方法来设计和实现软件系统,从而提高代码的可维护性、可扩展性和可重用性。C 是一种支持多种编程范式(如面向对象、泛型编程等)的语言,因此可以方便…...
Java 设计模式:装饰者模式详解
Java 设计模式:装饰者模式详解 装饰者模式(Decorator Pattern)是一种结构型设计模式,它通过动态地为对象添加新功能,扩展其行为,而无需修改原有类的代码。装饰者模式遵循“开闭原则”,提供了比…...
C++ 大数相加(简要版)
#include <algorithm> #include <iterator> class Solution { public:/*** 计算两个数之和* param s string字符串 表示第一个整数* param t string字符串 表示第二个整数* return string字符串*/string solve(string s, string t) {// 处理空字符串的情况…...
Spring IoC深度解析:掌控Bean存储艺术与分层架构的智慧
一、IoC的本质:从"造物主"到"使用者"的思维跃迁 在传统编程中,开发者像"造物主"一样亲手创建每个对象(new UserController()),并管理它们的依赖关系。这种方式导致代码高度耦合…...
8.4 容器2
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 8.4.3 TabControl(选项卡)控件 TabControl控件可以通过设置多个选项卡页(TabPage控件)…...
一组可能的机器学习问题列表
线性回归与多项式拟合的关系最小二乘法在机器学习中的应用梯度下降是如何实现的贝叶斯分类器的应用场景高斯分布与判定在哪里用到模型的评估有哪些参数误差中的偏差和方差定义训练集分组的快捷方式如何度量模型性能查准率查全率的定义roc,aux的含义正则化是什么意思k均值用来解…...
Android 权限列表
权限名称描述android.permission.ACCESS_CHECKIN_PROPERTIES访问登记属性读取或写入登记 check-in 数据库属性表的权限android.permission.ACCESS_COARSE_LOCATION获取粗略位置通过 WiFi 或移动基站的方式获取用户粗略的经纬度信息,定位精度大概误差在 30~1500 米an…...
探索在视频深度伪造中的细微的表情变化或对特定面部特征的小改动检测方法
概述 2019 年,美国众议院议长南希佩洛西成为了一次针对性的、技术含量相对较低的“深度伪造”式攻击的目标。真实的佩洛西视频被编辑,让她看起来像是喝醉了酒。这一不真实的事件在真相大白之前被分享了数百万次,而且在一些人没有关注后续报道…...
调用阿里云API实现身份证文字识别
TOC# 1.作者介绍 姚元帅,男,西安工程大学电子信息学院,2024级研究生 研究方向:机器视觉与人工智能 电子邮件:3183969029qq.com 乔幸荣,女,西安工程大学电子信息学院,2024级研究生&a…...
使用UFW+IPSET禁用海外IP配置持久化操作
上一章我们介绍了如何使用ufwipset禁用海外IP,但是如果服务器重启动,之前的配置就无效了,所以让配置持久化可以避免我们反复设置的麻烦。 IPSET配置持久化的方法有很多种,目前我配置成的是设置ipset后台服务,具体方法…...
深入Linux内核理解socket的本质
本文将从一个初学者的角度开始聊起,让大家了解 Socket 是什么以及它的原理和内核实现。 一、Socket 的概念 Socket 就如同我们日常生活中的插头与插座的连接关系。在网络编程中,Socket 是一种实现网络通信的接口或机制。 想象一下,插头插入…...
Python使用爬虫IP抓取数据过程
用户之前询问了不同语言的爬虫示例,特别是Python、Node.js和Ruby。现在他们希望详细扩展Python版本中使用代理IP的过程。 用户可能已经掌握了基本的爬虫编写,但遇到了IP被封的问题,或者想防止被封。他们需要知道如何集成代理IP到现有的代码中…...
通过MCP+数据库实现AI检索和分析
通过 MCP(Multi-Agent Collaboration Platform,多智能体协作平台) 数据库,实现一个AI检索和分析系统。 一、系统目标 实现通过 AI 多智能体对结构化(数据库)和非结构化(文档、文本)…...
51单片机烧录程序演示教程
51单片机烧录程序演示教程 51单片机是一种经典的8位单片机,广泛应用于嵌入式系统开发中。烧录程序是指将编译好的代码下载到单片机的存储器中,以便单片机能够按照程序运行。以下是详细的烧录流程和步骤。 所需工具和材料 硬件: 51单片机开发…...
06软件测试需求分析案例-添加用户
给职业顾问部的老师添加用户密码后,他们才能登录使用该软件。只有admin账户具有添加用户、修改用户信息、删除用户的权利。admin是经理或团队的第一个人的账号,后面招一个教师就添加一个账号。 通读需求是提取信息,提出问题,输出…...
Asp.NET Core WebApi IOptions<T>详解
IOptions<T> 是 ASP.NET Core 中用于访问配置数据的一个接口,它属于 Microsoft.Extensions.Options 命名空间。通过 IOptions<T>,你可以将配置绑定到强类型的类中,并在应用程序的不同部分中注入和使用这些配置。这种方式不仅使得…...
Gartner发布软件供应链安全市场指南:软件供应链安全工具的8个强制功能、9个通用功能及全球29家供应商
攻击者的目标是由开源和商业软件依赖项、第三方 API 和 DevOps 工具链组成的软件供应链。软件工程领导者可以使用软件供应链安全工具来保护他们的软件免受这些攻击的连锁影响。 主要发现 越来越多的软件工程团队现在负责解决软件供应链安全 (SSCS) 需求。 软件工件、开发人员身…...
(四十三)Dart 中的空安全与 `required` 关键字
Dart 中的空安全与 required 关键字 空安全(Null Safety) 空安全(Null Safety)是 Dart 语言的一项重要特性,旨在帮助开发者避免空指针异常(NullPointerException)。空安全通过在编译时检查变量…...
《解锁分布式软总线:构建智能设备统一管理平台》
智能设备的数量呈爆发式增长,从智能家居里的各类电器,到智能办公中的电脑、打印机,再到工业领域的各种自动化设备,不一而足。如何对这些纷繁复杂的智能设备进行有效管理,成为摆在我们面前的一道难题。分布式软总线技术…...
【android bluetooth 协议分析 01】【HCI 层介绍 1】【hci_packets.pdl 介绍】
在 AOSP 的蓝牙协议栈 (Gabeldorsche) 中,hci_packets.pdl 是一个 协议描述语言文件,用于定义 HCI (Host Controller Interface) 层的数据包结构和通信协议。以下是详细解析: 1. 文件作用 system/gd/hci/hci_packets.pdl 协议自动化生成&…...
远程升级组件设计
----------------------- | 主应用程序 | ---------------------- | 通信接口(使用本地socket通信发送给远程升级模块进程或者线程 | (如何启动进程程execl或execv函数),启动线程用std::sthread。 v ---------------------- 远程升级模块 ----------…...
Kubernetes集群环境搭建与初始化
1.Kubernetes简介: Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。 在Kubernetes中,我…...
Compose 适配 - 响应式排版 自适应布局
一、概念 基于可用空间而非设备类型来设计自适应布局,实现设备无关性和动态适配性,避免硬编码,以不同形态布局更好的展示内容。 二、区分可用空间 WindowSizeClasses 传统根据屏幕大小和方向做适配的方式已不再适用,APP的显示方式…...
5G_WiFi_CE_DFS
目录 一、规范要求 1、法规目录 2、定义 3、运行模式 4、主/从设备相关的运行行为及具体的动态频率选择(DFS)要求 5、产品角色确定测试项目 6、测试项目 测试项1:信道可用性检查(Channel Availability Check) …...
Lalamove基于Flink实时湖仓演进之路
摘要:本文投稿自货拉拉国际化技术部 资深数据仓库工程师林海亮老师。内容分为以下几个部分: 1、业务简介 2、Flink 在业务中的应用与挑战 3、实时数仓架构的 Flink 驱动演进 4、未来展望 一、业务简介 Lalamove 于2013年在香港成立,是货拉拉的…...
【含文档+PPT+源码】基于微信小程序的卫生院预约挂号管理系统的设计与实现
项目视频介绍: 毕业作品基于微信小程序的卫生院预约挂号管理系统的设计与实现 课程简介: 本课程演示的是一款基于微信小程序的卫生院预约挂号管理系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习…...
人工智能100问☞第2问:机器学习的核心原理是什么?
目录 一、通俗解释 二、专业解析 三、权威参考 机器学习的核心原理是通过数据训练模型,使计算机自动发现数据中的内在规律或模式,并利用这些规律对新数据做出预测或决策。这一过程强调数据驱动(从经验中学习)、模型优化(通过损失函数和参数调整提升性能)以及泛…...
【深度学习基础】——机器的神经元:感知机
感知机模型的原理之前已经讲过(【感知机模型 - CSDN App】https://blog.csdn.net/2401_88885149/article/details/145563837?sharetypeblog&shareId145563837&sharereferAPP&sharesource2401_88885149&sharefromlink)但主要是从数学和机…...