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

Mysql数据库深入理解

目录

一、什么是数据库

二、Mysql基本架构图

1.Mysql客户端/服务器架构 

2.客户端与服务器的连接过程

3.服务器处理客户端请求

4.一条查询SQL执行顺序

4.1连接器

4.2查询缓存

4.3解析器

4.4执行器

4.4.1预处理阶段

4.4.2优化阶段

4.4.3执行阶段

5.一条记录如何存储(存储引擎层)

6.补充拓展——Compact 行格式

6.1varchar(n) 中 n 最大取值为多少?

6.2行溢出后,MySQL 是怎么处理的?

6.3MySQL 的 NULL 值是怎么存放的

6.4MySQL 怎么知道 varchar(n) 实际占用数据的大小

三、总结Mysql数据库常用命令行


一、什么是数据库

  • 数据库(Database) :存储的数据的集合,提供数据存储的服务
  • 数据(Data) :实际上指的是描述事物的符号记录
  • 数据库管理系统(Database Management System,DBMS ) : 数据库管理系统,是位于⽤户与操作系统之间的⼀层数据管理软件
  • 数据库系统管理员(Database Anministrator,简称为DBA) :负责数据库创建、使⽤及维护的专⻔⼈员
  • 数据库系统(Database System,DBS) :数据库系统管理员、数据库管理系统及数据库组成整个单元

二、Mysql基本架构图

为了管理方便,我们把连接器、查询缓存、分析器、优化器、执行器这些并不涉及真实数据存储的功能划分为MySql Server的功能,把真实存取数据的功能划分为存储引擎的功能。

Server层负责建立连接,分析和执行SQL

存储引擎层负责数据的存储和提取,默认为InnoDB,默认索引类型是B+树

1.Mysql客户端/服务器架构 

MySQL的服务器程序直接和我们存储的数据打交道,可以有好多客户端程序连接到这个服务器程序,发送增删改查的请求,然后服务器响应这些请求,从而操作它所维护的数据。MySQL的每个客户端都需要提供用户名密码才能登录,登录之后才能给服务器发请求来操作某些数据。我们日常使用MySQL的情景一般是这样的:

  • 启动MySQL服务器程序。
  • 启动MySQL客户端程序并连接到服务器程序。
  • 在客户端程序中输入一些命令语句作为请求发送到服务器程序,服务器程序收到这些请求后,会根据请求的内容来操作具体的数据并向客户端返回操作结果。

2.客户端与服务器的连接过程

运行着的服务器程序和客户端程序本质上都是计算机上的一个进程,所以客户端进程向服务器进程发送请求并得到回复的过程本质上是一个进程间通信的过程,MySQL支持下边三种客户端进程和服务器进程的通信方式:

  • TCP/IP
  • 命名管道和共享内存
  • Unix域套接字文件

3.服务器处理客户端请求

首先MySQL是典型的c/s架构,即client/Server架构,不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本<SQL语句>,服务器进程处理后再向客户端进程发送一段文本<处理结果>

客户端可以向服务器发送增删改查各类请求,我们这里以比较复杂的查询请求为例来画个图展示一下大致的过程:

从上图中可以看到不同的存储引擎用的都是同一个server层

  • 一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎
  • 跨引擎相关的功能都在server层实现,不同的存储引擎共用一个server层 --> 存储引擎是可插拔式的server层

server层包含 连接器、查询缓存、分析器、优化器、执行器

server层覆盖了mysql的大多数核心服务功能,以及所有的内置函数<如日期、时间、数字和加密等函数>,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等

4.一条查询SQL执行顺序

4.1连接器

MySQL 客户端与服务器间进行 TCP 三次握手建立连接;
服务端校验客户端的用户名和密码,如果用户名或密码不对,则会报错;
如果用户名和密码都对了,会读取该用户的权限,然后后面的权限逻辑判断都基于此时读取到的权限;

注意:定期断开长连接避免内存占用,最大连接用户限制默认151,空闲连接超过默认时间连接器自动断开

4.2查询缓存

连接成功,接收SQL语句,查看类型若为查询语句就在缓存中查找之前是否有缓存执行过这条语言的数据,如果有就直接返回,没有就继续执行,待执行完之后,查询语句与执行结果以key-value的形式加入缓存;

由于只要有一个表有更新操作,查询缓存就会被清空,对于更新比较频繁的情况下这个功能几乎无用且耗时,所以MySQL8.0开始就移除了server层的查询缓存。注意:Innodb 存储引擎中的 buffer pool并没有移除

4.3解析器

解析SQL语句,先进行词法分析,识别出关键字构建SQL语法树,然后进行语法分析,判断是否满足SQL语法,如果关键字错误,或者语法错误这里就会报错并返回。

这里只进行词法和语法分析,表或字段是否存在,这里并不判断

4.4执行器

根据解析器生成的语法树,进行以下三步走执行:
预处理阶段(prepare)–> 优化阶段(optimize )–> 执行阶段(execute)

4.4.1预处理阶段

检查 SQL 查询语句中的表或者字段是否存在;如果不存在返回报错
将 select * 中的 * 符号,扩展为表上的所有列;

4.4.2优化阶段

基于查询成本考虑选择SQL语句的执行方案,比如在表里面有多个索引的时候使用什么索引?
最低效的就是全表扫描。优化可能为主键索引等

4.4.3执行阶段

根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;

总结

select * from test where id=10;        # 假设数据库使用的引擎为InnoDB

  • 首先Mysql客户端发送查询请求到Mysql服务端,由连接器负责和客户端建立连接,验证用户身份并查询出该用户所拥有的权限;
  • 访问查询缓存(是否可以命中缓存<存在缓存则直接返回,不存在则执行后续操作>,前提是开启了查询缓存)
  • 分析器/解析器(对SQL进行词法分析和语法分析操作,生成一个语法树,将客户端发送过来的SQL文本解析为Mysql可以看懂的指令)
  • 优化器(主要对执行的SQL进行优化,选择最优的执行计划)
  • 执行器(执行时会先看用户是否对该表有执行权限,有权限才会根据执行计划去调用存储引擎提供的接口进行执行)

如果ID字段没有索引,那么执行步骤如下:

  • 调用InnoDB引擎接口取这个表的第一行,在Server层判断ID是否为10,如果不是则跳过,如果是则将这行存到结果中
  • 调用引擎接口取下一行记录,重复相同的判断逻辑,直到取到这个表的最后一行
  • 执行器将上诉遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端

注意:这里并不是在server层汇总所有的结果集然后一次性发送给客户端,其实server层发现一条符合条件的记录就会发送到本地的网络缓冲区,等缓冲区满了之后才发送给客户端。

如果ID字段存在索引,那么执行步骤是这样的:

执行逻辑与上方差不多,第一次调用的是“满足条件的第一行”这个接口,之后循环的去调用“满足条件的下一行”这个接口(这些接口都是在引擎中已经定义好的),最后将所有满足条件的行组成的记录集作为结果集返回给客户端

注意:在有些场景下,执行器调用一次,在引擎内部会扫描多行,因此引擎扫描的行数跟 rows_examined 并不是完全相同的。

5.一条记录如何存储(存储引擎层)

MySQL的数据由存储引擎实现保存在磁盘上的,InnoDB是默认也是常用的存储引擎,用SHOW VARIABLES LIKE 'datadir';可以查看MySQL数据库文件存储的目录,每创建一个数据库,这里就会多一个以该数据库名的目录,目录下的三个文件,分别为:

  • 以.MYI的后缀文件存储当前数据库的索引文件
  • 以.frm的后缀文件存储对应表的表结构,保存每个表的元数据信息
  • 以.MYD的后缀文件存储对应表的表数据表,默认每张表存放在一个独占表空间文件

表空间由段(segment)、区(extent)、页(page)、行(row)组成,InnoDB存储引擎的逻辑存储结构大致如下图:

数据库表中的记录都是按行(row)进行存放的,每行记录根据不同的行格式,有不同的存储结构。
InnoDB 的数据是按「页」为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个行记录从磁盘读出来,而是以页为单位,将其整体读入内存。默认每个页的大小为 16KB

总之,数据库表中的记录按行存储在「数据页」里

6.补充拓展——Compact 行格式

6.1varchar(n) 中 n 最大取值为多少?

一行记录最大能存储 65535 字节的数据,但是这个是包含「变长字段字节数列表所占用的字节数」和「NULL值列表所占用的字节数」。所以, 我们在算 varchar(n) 中 n 最大值时,需要减去这两个列表所占用的字节数。

如果一张表只有一个 varchar(n) 字段,且允许为 NULL,字符集为 ascii。varchar(n) 中 n 最大取值为 65532。

计算公式:65535 - 变长字段字节数列表所占用的字节数 - NULL值列表所占用的字节数 = 65535 - 2 - 1 = 65532。

如果有多个字段的话,要保证所有字段的长度 + 变长字段字节数列表所占用的字节数 + NULL值列表所占用的字节数 <= 65535。

6.2行溢出后,MySQL 是怎么处理的?

如果一个数据页存不了一条记录,InnoDB 存储引擎会自动将溢出的数据存放到「溢出页」中。如下图

6.3MySQL 的 NULL 值是怎么存放的

MySQL 的 Compact 行格式中会用「NULL值列表」来标记值为 NULL 的列,NULL 值并不会存储在行格式中的真实数据部分。

NULL值列表会占用 1 字节空间,当表中所有字段都定义成 NOT NULL,行格式中就不会有 NULL值列表,这样可节省 1 字节的空间。

6.4MySQL 怎么知道 varchar(n) 实际占用数据的大小

MySQL 的 Compact 行格式中会用「变长字段长度列表」存储变长字段实际占用的数据大小。

三、总结Mysql数据库常用命令行

命令行含义备注
show databases;查看数据库
show tables in database_name;查看数据表
show tables;查看数据表
describe table_name;查看数据表结构
create database database_name;创建数据库DDL数据定义语言
create table table_name(字段);创建数据表
drop database database_name;删除数据库
drop table table_name;删除数据表
insert into table_name(字段) values (字段);插入数据DML数据操纵语言
insert into table_name values(字段);插入数据
update table_name set 字段=指定要修改的内容修改数据为指定值
update table_name set 字段=指定要修改的内容 where 字段=指定字段;指定字段修改内容
delete from table_name;删除指定数据表
delete from table_name where 字段=指定字段;删除指定数据表的指定字段
select * from table_name;查询指定数据表所有数据DQL数据查询语言
select 字段1,字段2... from table_name;查询指定数据表指定字段
select 字段1,字段2... from table_name where 字段=指定字段;查询指定数据表指定字段匹配到指定的字段的数据信息
select 字段1,字段2... from table_name limit 指定行(可以指定从第几行显示多少行);查询指定数据表指定行的数据
select * from table_name \G;查询指定表以竖向显示数据
alter table table_name rename new_table_name;修改指定数据表变更新的数据表名DCL数据控制语言
alter table table_name add 字段(字段结构类型);扩展表结构,新增字段
alter table table_name change 字段 新字段(字段结构类型);修改表结构
alter table table_name drop 字段;删除表结构
delete from table_name;

删除指定数据表,可自增(auto_increment)写入

可回滚,可带where条件判断

表结构在,表内容看删除内容

支持删除部分数据 建议用

DML数据操纵语言
truncate table table_name;

删除指定数据表,不支持自增写入

不可回滚,不可带where条件判断

表结构在,删除数据表内容

想删除表内容保留表,不和事务相关可用

DDL数据定义语言
drop from table_name;

删除指定数据表

不可回滚,不可带where条件判断

删除表结构和表内容

想删除表可以用

DDL数据定义语言
create temporary table table_name 字段;创建临时表临时表是临时存在的无法show tables查看,退出数据库再登入即消失

create table new_table_name like table_name;

insert into new_table_name select * from table_name;

克隆表结构;

克隆表数据。

like方法(适用于数据迁移)
create table new_table_name(select * from table_name);直接创建新表的时候克隆适用于只备份数据
create user 'user_name'@'指定地址' identified by '指定密码';新建用户

指定地址可以为localhost

也可以为指定的IP(IP可以指定网段,其中可以填入%来使用)

rename user 'user_name'@'指定地址' to 'new_user_name'@'新指定地址';用户重命名
drop user 'user_name'@'指定地址';删除用户
set password = password('new_password');修改当前密码如果是此命令指定,那么authentication_string字段就是显示密文
set password for 'user_name'@'指定地址' = password('new_password');修改指定用户密码
skip_grant_tables跳过授权表用于忘记密码后插入到服务端的配置文件(/etc/my.cnf)
update mysql.user set authentication_string=password ('new_password') where user=user_name;修改指定用户密码操作该命令行后需要刷新权限(flush privileges)
grant 权限1,权限2... on database_name.table_name 'user_name'@'指定地址' identified by 'password';将某个数据库中的数据表授予指定权限给指定用户该用户只能通过授权获得的密码登入数据库,对指定数据库中的数据表进行指定权限的操作
show grants for 'user_name'@'指定地址';查看用户权限
revoke 权限1,权限2... on database_name.table_name from 'user_name'@'指定地址';撤销用户权限
create index index_name on table_name(索引列);直接创建普通索引普通索引
alter table table_name add index index_name(索引列)修改表结构时创建索引
create table table_name (字段 index index_name(索引列));创建表时创建索引
create unique index index_name on table table_name(索引列);直接创建唯一索引

唯一索引

unique

alter table table_name add unique index_name (索引列);修改表结构创建唯一索引
create table table_name (字段,unique index index_name(索引列));创建表时指定唯一索引
create table table_name (字段,primary key(索引列));创建表时创建主键索引

主键索引

primary key

alter table table_name add primary key(索引列));修改表时指定主键索引
create table table_name (字段,index index_name(索引列))创建表时指定组合索引

组合索引

(可以单列索引,可以多列索引)

create fulltext index index_name on table_name(索引列);直接创建全文索引

全文索引

fulltext

可作用在char varchar text类型列上

alter table table_name add fulltext index_name(索引列);修改表方式创建全文索引
create table table_name(字段,fulltext index_name(索引列));创建表时指定全文索引
show index from table_name;查看索引查看索引
show keys from table_name;查看索引
drop index index_name on table_name直接删除索引删除索引
alter table table_name drop index index_name;修改表方式删除索引
alter table table_name drop primary key;删除主键索引
select @@global.tx_isolation;查看全局事务隔离级别
show global variables like '%isolation%';
select @@session.tx_isolation;查看当前会话隔离级别
show session variables like '%isolation%';
begin;开启事务
start transaction
commit;提交事务
commit work;
rollback;回滚至最原始未结束的事务修改表结构后无法回滚事务
rollback work;
rollback to savepoint S1/S2...回滚至事务中的标记点
savepoint S1事务中增加标记点
set autocommit=0或1修改是否提交事务Mysql数据库默认的是自动提交事务,默认为1;如果没有开启自动提交,当前会话所有操作直到输入rollback或者commit才算结束
show variables like 'autocommit'查看Mysql中的AUTOCOMMIT值
show engines;查看数据库支持的存储引擎
show table status from database_name where name='table_name';查看指定数据表的引擎
alter table table_name engine=引擎;直接修改存储引擎
default-storage-engine=引擎;修改配置文件修改引擎配置文件位置在/etc/my.cnf,修改完配置文件后需要重启MySQL数据库,一般不建议使用
create table table_name(字段1,字段2...)engine=引擎;创建表时指定引擎

相关文章:

Mysql数据库深入理解

目录 一、什么是数据库 二、Mysql基本架构图 1.Mysql客户端/服务器架构 2.客户端与服务器的连接过程 3.服务器处理客户端请求 4.一条查询SQL执行顺序 4.1连接器 4.2查询缓存 4.3解析器 4.4执行器 4.4.1预处理阶段 4.4.2优化阶段 4.4.3执行阶段 5.一条记录如何存…...

android 音频焦点,音频策略梳理

音频焦点和音频策略两个不同的概念&#xff0c;容易搞混 先来看下音频焦点和音频策略直接的区别和联系 音频策略的主要功能是为该音频找到合适的硬件设备播放 1 音频策略流程&#xff1a; (从usage->device) attributesBuilder.setUsage--->audioservice.mCarAudioCont…...

go语言-基础元素与结构的使用

go基础元素与结构的使用&#xff0c;快速上手 编译go文件 编译为可执行文件 go build 文件名.go运行文件 ./文件名输入/输出 引用fmt库&#xff08;关于输入输出的库&#xff09; 输入 scanf按照给定的格式依次读取数据&#xff08;包括非法数据&#xff09;&#xff0c;不…...

【leetcode热题】 二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: []解法一 题…...

康奋威科技邀您到场参观2024长三角快递物流展

参展企业介绍 杭州康奋威科技股份有限公司创立于2005年&#xff0c;由国家“万人计划”专家任天挺先生创立并担任法人&#xff0c;是一家专业从事智能装备研发与制造的国家级高新技术企业。专注于自动化控制、机械设计、信息化方面的技术研究&#xff0c;主要为太阳能光伏、智…...

linux centos 安装jenkins,并构建spring boot项目

首先安装jenkins&#xff0c;使用war包安装&#xff0c;比较简单&#xff0c;注意看下载的版本需要的JDK版本&#xff0c;官网下载https://www.jenkins.io/download/ 把下载好的war包放到服务器上&#xff0c;然后运行&#xff0c;注意8080端口的放行 # 前台运行并指定端口 ja…...

是德科技keysight DSOX3024T示波器

181/2461/8938产品概述&#xff1a; DSOX3024T 示波器 要特性与技术指标 使用电容触摸屏进行简洁的触控操作&#xff1a; •提高调试效率 •触控设计可以简化文档记录 •使用起来就像您喜欢的智能手机或平板电脑一样简单 使用 MegaZoom IV 技术揭示偶发异常&#xff1a; •超快…...

C#获取HTML源码

C#获取HTML源码 2024年03月23日记录 以前的那个从网上找到的方法, 在一些网站上用不了&#xff0c;如17K&#xff0c;取出来的是乱码&#xff0c;要么就是一坨JS&#xff0c;好像是用JS又重新加载了什么的 using System; using System.Collections.Generic; using System.We…...

element-ui checkbox 组件源码分享

简单分享 checkbox 组件&#xff0c;主要从以下三个方面来分享&#xff1a; 1、组件的页面结构 2、组件的属性 3、组件的方法 一、组件的页面结构 二、组件的属性 2.1 value / v-model 属性&#xff0c;绑定的值&#xff0c;类型 string / number / boolean&#xff0c;无…...

JavaEE--小Demo--数据库建立

目录 实验准备 本次所要新建的文件 实验步骤 step1-demo.sql 1.在resources文件夹下新建demo.sql文件 2.打开此目录&#xff0c;并运行命令提示符 3.打开数据库mysql -uroot -p 4.创建数据库create database demo; 5.使用数据库use demo; 6.导入数据source demo.sql;…...

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记19_前方的路

1. 技术与财富分配不均 1.1. 当前的财富分配不均早已成为世界难题 1.1.1. 世界上有一半的人口——相当于35亿人——拥有的财富却不敌在一辆双层巴士上的商业精英的个人财富总和 1.2. 部分线上市场仍受到竞争机制支配的事实并不能为其他市场的反竞争策略开脱 1.3. 企业的市场…...

MySQL双一参数性能测试

MySQL双一参数 MySQL 数据库中有两个非常重要的参数&#xff0c;一个是innodb_flush_log_at_trx_commit&#xff0c;另外一个是sync_binlog&#xff0c;这两个参数称之为双一参数&#xff0c;前者控制了redo log 的刷盘机制&#xff0c;后者控制了binlog 的刷盘机制 这两个参…...

CodeSys创建自定义的html5控件

文章目录 背景创建html5control.xml文件控件界面以及逻辑的实现使用的资源安装自定义的html5控件库 背景 查看官方的资料&#xff1a;https://content.helpme-codesys.com/en/CODESYS%20Visualization/_visu_html5_dev.html 官方的例子&#xff1a;https://forge.codesys.com/…...

Xcode15报错: SDK does not contain ‘libarclite‘

pod lib lint *** 报错 clang: error: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment target 或者xcode…...

矩阵快速幂

快速幂 #include<iostream> using namespace std;int main(){int a, b, p;cin>>a>>b>>p;int res 1 % p;while(b){if(b & 1) res 1ll * res * a % p;a 1ll * a * a % p;b >> 1;}cout<<res;return 0; }斐波那契数列 #include <ios…...

数据之谜:解读Facebook的用户行为

在当今数字化时代&#xff0c;社交媒体平台已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交网络之一&#xff0c;其背后隐藏着许多数据之谜。本文将深入探讨Facebook的用户行为&#xff0c;并试图解读其中的奥秘。 用户行为数据的收集 Facebook作…...

学习 考证 帆软 FCP-FineBI V6.0 考试经验

学习背景&#xff1a; 自2024年1月起&#xff0c;大部分时间就在家里度过了&#xff0c;想着还是需要充实一下自己&#xff0c;我是一个充满热情的个体。由于之前公司也和帆软结缘&#xff0c;无论是 Fine-Report 和 Fine-BI 都有接触3年之久&#xff0c;但是主要做为管理者并…...

《过滤器模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式&#xff08;极简c版&#xff09;》-CSDN博客 本章简要说明过滤器模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。 模式说明 方案&#xff1a; 过滤器模式是一种结构型设计模式&#xff0c;用于过滤一组对象&#xff0c;基…...

【C++】如何用一个哈希表同时封装出unordered_set与unordered_map

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.哈希桶源码 2.哈希…...

Day45:WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件

目录 PHP-MYSQL-二次注入-DEMO&74CMS DEMO-用户注册登录修改密码 CMS-74CMS个人中心简历功能 PHP-MYSQL-堆叠注入-DEMO&CTF强网 Demo 2019强网杯-随便注&#xff08;CTF题型&#xff09; PHP-MYSQL-带外注入-DEMO&DNSLOG(让服务器主动把数据交出去) 知识点&…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...