Mysql整体介绍(适用于5.X版本)(上)(标贝科技)

2023-05-16

标贝科技 https://ai.data-baker.com/#/?source=qwer12

填写邀请码fwwqgs,每日免费调用量还可以翻倍
在这里插入图片描述
在这里插入图片描述

Mysql整体介绍(适用于5.X版本)(标贝科技)

Mysql 8.X版本和 5.X版本相比,有比较大的调整。目前工作中应用最广的是Mysql 5.6/5.7的版本,所以文章将聚焦于对Mysql 5.6/5.7版本进行介绍,8.X版本的相关改动,有机会再单独整理。

一、Mysql体系结构

Mysql是一个单进程多线程、基于C/S架构的关系型数据库管理系统,其体系结构如图1所示(图片参考Mysql官方手册,各个版本会进行少许调整,总体上仍是准确的,虚线标出的查询缓存和缓冲区部分在Mysql 8.X版本中已废弃,侧面反映了数据库的查询缓存实际上比较鸡肋)。客户端是一个广义的概念,指提供连接能力的各种组件和API。服务端包括连接池、管理组件和工具类、SQL接口、解析器、优化器、缓存、插拔式存储引擎、文件系统等许多组件。

图1 Mysql体系结构
在这里插入图片描述

1.1 C/S通信协议相关内容

在服务器启动的过程中,会完成创建套接字并绑定端口等工作。然后会在handle_connections_methods()函数中完成监听,监听其实就是等待用户的连接请求。这个函数中会处理三种连接方式:命名管道、套接字及共享内存。由于大多情况下,会采用套接字的连接方式,其他连接方式只有在一定条件下才能使用,所以本文只介绍套接字相关的部分。
MySQL客户端进程和服务器进程的Connection Pool之间是基于Mysql Client/Server协议[1]进行通讯的,该协议用于连接、代理、主备复制等操作,支持 SSL、压缩等特性。
Mysql C/S协议的内涵比较丰富,它规定了连接的各个生命周期的数据格式和行为,包括:各数据类型的编码格式、各种操作的请求数据包的格式、结果返回包的格式、字符集、数据包压缩和数据包TLS加密等等。
连接的生命周期包括三部分内容:连接阶段 (Connection Phase)、请求阶段 (Command Phase) 和拷贝协议 (Replication Protocol)。其中,拷贝协议比较独立,主要用于主从节点间的binlog同步。其大体流程是:建立连接后,Client向Server发送一个MySQL binlog dump的命令,随后,Server不断地给Client发送binlog event。本文不再详细介绍,如果希望进一步了解,推荐查看go-mysql-elasticsearch作者写的这篇文章:深入解析MySQL replication协议[3]。下面我们重点介绍一下连接阶段和请求阶段。

1.1.1 连接阶段(Connection Phase)通信

1.协议数据包
先简单介绍Mysql协议的数据包(packet)[2],Mysql的数据包均由header和body两部分构成:header总共有4个字节,3个字节用来标识 payload 的大小,1个字节记录sequence ID,来保证交互时报文的顺序;body则保存实际的负载数据(payload)。
在这里插入图片描述

这是Mysql最基础的数据包结构,所有具体操作的数据包都是基于这个数据包结构进行扩展的,即不同的操作对应不同的负载数据,具体的载荷内部结构可以自行查阅官网。此外,如果数据包的大小大于16MB,会被拆包。
2.工作流程
Mysql的连接阶段主要包含“握手”和“认证”两个步骤,具体参考图2。
在这里插入图片描述

图2 Mysql连接阶段时序图
3.握手
Mysql版本众多,客户端和服务端版本不一定匹配,二者支持的功能需要有个协商的过程,这就是“握手”部分的主要工作。协商时最主要依赖的是capabilities flags,这是一种功能标志,具体内容如图3所示,包括是否支持压缩功能、是否支持CLIENT_PROTOCOL_41版本协议、是否使用SSL加密等等。
4.认证
“握手”完成后,执行“认证”操作。MySQL的认证授权采用插件方式实现,默认采用mysql_native_password 插件[5]。该插件的核心逻辑在函数scramble()中,该函数通过用户输入的password、服务器返回的scramble生成reply,返回给服务端;服务端再与数据库信息或缓存信息进行比对。
MySQL 的用户管理模块信息存储在系统表mysql.user中,其中包括了授权用户的基本信息以及一些权限信息。在登陆时,只会用到 host、user、passwd 三个字段。服务器在收到新的连接请求时,会调用 login_connection() 方法进行身份验证,先根据 IP 做 ACL 检查,然后才进入用户名密码验证阶段。
在这里插入图片描述

图3 Mysql capabilities flags介绍[4]
下面简单对user、db、table_priv和columns_priv这几张系统表的含义进行说明。其中,user表是全局级的权限和信息,修改后可能发生对已有连接不生效的情况。

  • user:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
  • db:记录各个帐号在各个数据库上的操作权限。
  • table_priv:记录数据表级的操作权限。
  • columns_priv:记录数据列级的操作权限。

Mysql这么处理,是为了保证效率,它在每个连接的内存里缓存了user表中的用户信息和权限信息。直接修改磁盘中user表的用户密码、权限等信息,是不会马上同步至内存的。要解决这个问题,只需执行“flush privileges;”即可,该操作的实质是:将系统表mysql.user中的用户信息和权限设置从磁盘中重新获取,并缓存到内存数组里。
5.线程缓存和线程池
在5.6版本以前,Mysql处理连接的方式是One-Connection-Per-Thread,即对于每一个数据库连接,Server端都会创建一个独立的线程服务。不过,Mysql也提供了thread-cache机制来缓解频繁创建和释放线程的问题(由图1中“Connection pool”内的“Thread Reuse”子模块实现),我们可以将线程缓存起来,以供下次使用,但是它仍然无法解决高连接数的问题。
从5.6版本开始,Mysql在服务端提供的一个重要功能:线程池。线程池是一种有效的技术,通过预先创建一定数量的线程,当有请求达到时,线程池分配一个线程提供服务,请求结束后,该线程又去服务其他请求或者进入睡眠状态。
线程池和线程缓存方案的区别在于:线程池方案每个线程服务的最小单位是SQL语句,即一个线程可以对应多个活跃的连接。它避免了线程大量创建销毁带来的性能消耗,同时解决了高连接数引起的高内存消耗问题。

1.1.2 请求阶段(Command Phase)通信

如果只关注客户端和服务端的通信过程,其实非常简单:客户端通过建立好的连接向服务端发送数据包,服务端接收到数据包后,解析并按照客户端要求去执行命令,然后将结果集返回至客户端。
但Mysql的C/S协议关于请求阶段的内容其实非常丰富,因为它既包含了客户端和服务端之间的通信部分,也包含了服务端内部交互的命令的相关规定。总体而言,C/S协议为请求阶段规定了4个方面内容:文本协议 (Text Protocol)、通用命令 (Utility Commands)、预编译语句 (Prepared Statements)、存储程序 (Stored Programs)[6]。
1.文本协议(Text Protocol)
只包含COM_QUERY命令,该命令规定了客户端的请求数据格式和服务端返回的数据格式。
客户端请求的格式比较简单,其payload的基本结构如表1所示 (某些条件下可能包含其他内容),其中“string[EOF]”表示字符串在payload的最后,它的特点是字符串的长度可以通过包的大小和当前初始位置计算出来[7]:
在这里插入图片描述
在这里插入图片描述
图4 COM_QUERY响应结果示意图[1]
服务端返回的数据格式相对复杂,参考图4。可以看出返回包含4种情况:
1). 如果执行错误,比如SQL语法错误,返回ERR包,即0xFF标志;
2). 如果执行成功,但没有查到任何数据,返回OK包,即0x00标志;
3). 如果客户端的执行导入数据操作 (load data local infile ‘filename’ into table ),
则返回方式遵循"本地文件导入"子协议 (Protocol::LOCAL_INFILE_Request)。协议的定义如图5所示:服务端收到请求后,将0xfb标志和文件名返回给客户端,表示希望获取文件数据(GET_MORE_DATA),客户端收到后发送文件数据 (SEND_MORE_DATA),结束后服务端返回OK包或者ERR包;
在这里插入图片描述

图5 LOCAL_INFILE_REQUEST子协议的交互过程[7]
4). 其他情况服务端将遵循“结果集"子协议(ProtocolText::Resultset):结果集的第一包含有列长度信息(FIELD_COUNT,LengthEncodedInteger类型,存储列的个数);接下来是n个字段描述包,每一个字段描述就是一个包(Protocol::ColumnDefinition);当所有字段信息描述包发送完成后,会发送一个EOF包或OK包(5.7版本之前如果没有设置CLIENT_DEPRECATE_EOF标记,会发送EOF包,5.7后均返回OK包)作为字段定义与数据(Row)的分隔符号;接下来是行数据包(Protocol::ColumnDefinition),每一行一个数据包;最后的结束包,同样可能是EOF或OK包,如图4"Text Resultset"部分所示。
注:EOF数据包的格式比较简单,它主要用于标明查询结果的结尾,包内带有两个信息:警告数和状态码。在5.7.5版本之后,已被改进版的OK数据包替代
2.通用命令(Utility Commands)
通用命令包括:COM_QUIT、COM_INIT_DB、COM_FIELD_LIST、COM_REFRESH、COM_STATISTICS、COM_PROCESS_INFO、COM_PROCESS_KILL、COM_DEBUG、COM_PING、COM_CHANGE_USER、COM_RESET_CONNECTION、COM_SET_OPTION等。其中,COM_REFRESH、COM_PROCESS_INFO、COM_PROCESS_KILL等已被标志为deprecated,可能在较新的版本中会被替换成其他的命令来实现。
下面对常用的几个命令进行简单的说明:COM_QUIT用于断开和服务端的连接;COM_PING用来测试服务端是否处于alive状态;COM_CHANGE_USER用于切换当前连接的用户信息,会执行与握手阶段类似的认证操作流程并重置连接的状态。
3.预编译语句(Prepared Statements)
预编译是Mysql在4.1版本之后引入的,它包括两大步骤:

  1. . 客户端提交不传递真实的参数值的SQL,服务端完成预编译解析,这里的预编译解析包括解析参数的个数、类型等,然后响应给客户端;
//不传递真实参数值的SQL的示例
insert into sys_user(id, name) values(?, ?);
select * from `sys_user` where id = ?;

2). 客户端第二次传数据时,只传递参数,服务端收到后就可以完成一个完整的SQL的执行,并返回结果。
相比4.1版本之前的SQL执行方式,预编译方式需要两次交互,才能完成一次SQL执行,表面看增加了步骤,实际上由于预编译相关命令的请求参数和返回的结果集,均采用二进制格式来封装数据 (ProtocolBinary::Resultset),体积更小,更面向底层,能直接被Mysql服务端利用,实际上是预编译是非常高效的。并且预编译一次编译、多次运行,节省了重复解析优化的时间,同时还能一定程度上防止sql注入。
预编译阶段相关的命令主要有COM_STMT_PREPARE、COM_STMT_EXECUTE、COM_STMT_FETCH、COM_STMT_CLOSE、COM_STMT_RESET、COM_STMT_SEND_LONG_DATA。其中最重要的是COM_STMT_PREPARE和COM_STMT_EXECUTE:COM_STMT_PREPARE命令用于客户端往服务端提交一个不传递真实的参数值的待预编译的SQL;COM_STMT_EXECUTE用于服务端接收参数,并执行预编译后的SQL。
4.存储程序(Stored Programs)
从5.0版本开始,关于存储程序的协议内容包括两个部分:多结果集协议(Multi-Resultset)和多语句协议(Multi-Statement),分别规定了服务器端如何存储多结果集和如何处理多重查询。
其中,多结果集协议 (Multi-Resultset)主要用于多语句或存储过程等场景。多结果集是由基本的结果集结构拼接而成,如果第一个结果集中的标识行中的status设置了SERVER_MORE_RESULTS_EXISTS标记位,表明是多结果集,其它结果集紧随其后。
对于多语句协议 (Multi-Statement),本文不展开解释,仅介绍两个工作中常见的应用场景,方便大家理解。

  1. 在各种Mysql的客户端程序中 (Navicat、SQLyog或者Mysql自带客户端等),我们都可以一次执行多条sql,中间用英文逗号隔开即可,就是利用了Multi-Statement功能。
  2. 在Java的数据库连接配中,如果设置了allowMultiQueries=true选项,则可以在一个Mybatis代码块中写入多个sql语句,语句间使用英文分号隔开即可。
url: jdbc:mysql://xxx.com:3306/test_db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8

1.2 SQL执行过程

SQL执行过程分为两类:
1). 查询语句执行过程如下:查询缓存—》分析器—》优化器—》权限校验—》执行器—》引擎
2). 更新语句执行流程如下:分析器----》权限校验----》执行器—》引擎—redo log prepare—》binlog—》redo log commit
图6以Mysql Update语句为例,对SQL执行流程进行了比较清晰的展示,其他操作类型流程上类似。连接阶段在上文已经较为深入的介绍过,不再赘述。下面将聚焦在SQL的执行阶段,按顺序对执行阶段关键的步骤展开介绍。
在这里插入图片描述

图6 Mysql Update语句执行流程图[8]
1.2.1 缓存
Mysql的缓存主要的作用是为了提升查询的效率,缓存以key和value的哈希表形式存储,key是具体的sql语句,value是结果的集合。如果无法命中缓存,就继续走到分析器的的一步,如果命中缓存就直接返回给客户端 。由于查询缓存的失效非常频繁,如果在一个写多读少的环境中,缓存会频繁的新增和失效,优势并不明显。目前在5.6+版本中已经默认关闭了,且在8.0+版本中,缓存模块已被删除。
1.2.2 分析器
分析器的主要作用是将客户端发过来的SQL语句进行分析,这将包括预编译与解析过程。这个阶段包括两个步骤:第一步是词法分析,第二步是语法分析。
分析器会解析SQL语句的语义,并进行关键词和非关键词进行提取、解析,并组成一个解析树。具体的关键词包括不限定于以下:select/update/delete/or/in/where/group by/having/count/limit等。如果分析到语法错误,会直接给客户端抛出异常:You have an error in your SQL syntax。
比如:select * from user where userId =1234;
在分析器中就通过语义规则器将select from where这些关键词提取和匹配出来,Mysql会自动判断关键词和非关键词,将用户的匹配字段和自定义语句识别出来。这个阶段也会做一些校验:比如校验当前数据库是否存在user表,同时假如user表中不存在userId这个字段同样会报错:unknown column in field list。
1.2.3 优化器
能够进入到优化器阶段表示SQL是符合Mysql的标准语义规则的并且可以执行的。此阶段主要是进行SQL语句的优化,会根据执行计划进行最优的选择,匹配合适的索引,选择最佳的执行方案。
比如一个典型的例子是这样的:已知表T对A、B、C列建立联合索引,在进行查询的时候,SQL是:select xx where B=x and A=x and C=x。很多人会以为是用不到索引的,但其实会用到,虽然索引必须符合最左原则才能使用,但是本质上,优化器会自动将这条SQL优化为:where A=x and B=x and C=X,这种优化会为了底层能够匹配到索引,同时在这个阶段是自动按照执行计划进行预处理,mysql会计算各个执行方法的最佳时间,最终确定一条执行的sql交给最后的执行器。
1.2.4 执行器
在执行器的阶段,会调用存储引擎的API,API会触发存储引擎执行实际逻辑,并返回结果。Mysql支持的引擎可参图7,其中,最常用的是InnoDB。
在这里插入图片描述

图7 Mysql 引擎特性示意图[8]

参考文献
[1]https://dev.mysql.com/doc/dev/mysql-server/latest/PAGE_PROTOCOL.html
[2]https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_packets.html#sect_protocol_basic_packets_packet
[3]https://www.jianshu.com/p/5e6b33d8945f
[4]https://cloud.tencent.com/developer/article/1768901
[5]https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase_authentication_methods.html
[6]https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_command_phase.html
[7]https://dev.mysql.com/doc/internals/en/
[8]https://www.cnblogs.com/wyq178/p/11576065.html
[9]Mysql技术内幕:InnoDB存储引擎 (第2版). 姜承尧
[10]MySQL运维内参:MySQL、Galera、Inception核心原理与最佳实践. 周彦伟,王竹峰,强昌金
[11]https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html
[12]https://dev.mysql.com/doc/refman/5.7/en/faqs-innodb-change-buffer.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql整体介绍(适用于5.X版本)(上)(标贝科技) 的相关文章

  • 这个 SQL DELETE FROM 语法有什么问题?

    我正在尝试删除 96k 记录 删除表 xoops bb posts text 页面中没有与 xoops bb posts 匹配的 post id 的所有记录 此查询返回 91k 条记录 SELECT FROM xoops bb posts
  • 当数据表输入来自服务器的 JSON 数据时,更改 Google 图表栏颜色

    我一直在努力使用谷歌图表 API 我在 SO 上发现了这个出色的例子PHP MySQL Google Chart JSON 完整示例 https stackoverflow com questions 12994282 php mysql
  • 使用mysql在一个查询中选择多个表中的子项总数

    我整个下午都在尝试处理一个查询 或两个或三个 以获得三个表的所有子表的计数 看看我的设计 用户表 id user name 1 foo 2 bar 赢表 id won user 1 1 2 1 3 2 绘制表格 id draw user 1
  • MySQL SELECT 输出同一行中每个 id 的下一个日期

    我查询的表结构如下 ID Date Before value After value 1 2014 04 25 Win Loss 1 2014 04 30 Loss Win 1 2014 08 18 Win Loss 1 2014 08 2
  • SQL 检查一组日期是否在指定的日期范围内

    我有一个表 其中保存架构中房间不可用的日期 ROOM ID DATE UNAVAILABLE 我需要一个 sql 查询来检查两个日期范围内是否有可用房间 类似于 Select All rooms that are constantly av
  • MySQL InnoDB 查询性能

    我正在尝试优化一个简单的 sql 查询 该查询将多次运行大量数据 这是场景 MySQL 与 InnoDB 表 where 和 join 中使用的所有字段都已索引 表有 FK 我不需要查询的整个缓存 但每个表的缓存是可能的 表有更多的更新 插
  • Preg_replace() 删除除查询结尾之外的所有内容

    首先 为我糟糕的英语感到抱歉 我有这样的疑问 SELECT t1 SELECT COUNT FROM table a t2 WHERE t1 id t2 id c AND t2 status 1 AS aula FROM table c t
  • 通过货币换算获取每种产品类型的最低价格

    我想选择每种产品类型中最便宜的 包括运费 价格转换为当地货币 最便宜 产品 价格 产品 运费 seller to aud 我的数据库有如下表 PRODUCTS SELLERS id type id seller id price shipp
  • 在docker中使用MySQL数据库设置aspnetcore

    我正在尝试设置一个 docker compose 文件 其中包含 asp net core mysql 数据库和 phpmyadmin 的容器 设置我的 mysql 服务器没有问题 我可以使用 phpmyadmin 访问它 我的 asp n
  • MySQL 服务器未启动

    当我做 mysql u root p并输入my password这就是我得到的 错误 2002 HY000 无法通过套接字 var run mysqld mysqld sock 连接到本地 MySQL 服务器 2 所以我输入 systemc
  • MySQL 全文搜索不适用于某些单词,例如“house”

    我已经在 3 个字段中的一小部分记录上设置了全文索引 也尝试了 3 个字段的组合 并得到了相同的结果 有些单词返回结果很好 但某些单词如 house 和 澳大利亚 不这样做 有趣的是 澳大利亚 和 家乡 这样做 这似乎是奇怪的行为 如果我添
  • 使用按位函数查询 BIT 字段时,MySQL 不使用索引

    我的 MySQL 表中有一个 BIT 类型的字段 我想使用位值存储记录的状态 例如 1 status1 2 status2 4 status3 8 status4 每条记录可以同时具有多种状态 对于 status1 和 status3 该值
  • MySQL 存储过程将值分配给 select 语句中的多个变量

    这是我的存储过程 我在为声明的变量赋值时遇到问题 当我执行它时 插入和更新命令工作正常 但声明变量的值保持为 0 但我在数据库中有一些价值 我怎样才能正确地做到这一点 BEGIN DECLARE PaidFee INT DEFAULT 0
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp

随机推荐

  • 基于累加的PDM算法的原理

    基于累加的 PDM 算法 的 原理 基于累加的 PDM 算法 2 PDM编码原理如下 xff1a 单片机能输出Sin t 吗 xff1f 能 xff0c DA 没有DA怎么办 xff1f PWM 没有PWM怎么办 xff1f 事情就是这么来
  • PCM音频压缩A-Law算法,uLaw

    参考相关 xff1a 关于pcm音频头与a law音频头的互换代码 http blog csdn net fjhyy article details 6593049 https baike baidu com item A E5 BE 8B
  • Spyder cell分块运行 run cell

    Spyder是一个使用方便的Python开发环境 xff0c 安装Anaconda时自带 python代码分块 xff1a 使用Spyder xff0c 可以在python文件 xff08 py xff09 里使用 In 进行分块 如下图
  • C语言中实现bool(布尔型变量)

    C语言中 xff0c 本身没有bool xff08 布尔型变量 xff09 但是我们可以用其他方式来模拟 一 如果简单的使用char int long变量来表示0 1 xff0c 则太浪费空间了 二 这里介绍一种巧妙的方式实现bool xf
  • 随机解调-多频点信号与伪随机序列混频

    随机解调的多频点信号x与伪随机序列经过混频后 xff0c 被均匀的涂抹到了整个频率轴上 xff0c 然后经低通滤波 xff0c 低速均匀采样 xff0c 最后通过OMP等算法恢复原始信号 xff0c 整体上是压缩感知求解欠定方程y 61 A
  • 寻路算法 Astar A星算法

    lt span style 61 34 white space pre 34 gt lt span gt lt span style 61 34 white space pre 34 gt lt span gt 首先是创建一些变量 lt p
  • eclipse调试C代码时printf()不能输出到控制台的解决方法

    1 问题 在ecplise下使用CDT开发C C 43 43 程序中 xff0c 使用debug调试时 xff0c 到了printf 打印函数 xff0c 在console窗口中并没有打印出信息来 xff0c 停止后才会有输出 2 原因 在
  • C语言中带参宏定义

    include lt stdio h gt 1 带参宏定义中 xff0c 宏名和形参表之间不能有空格出现 2 宏定义中不存在值传递 xff0c 它只是一个符号的替换过程 3 带参宏定义中 xff0c 形参不分配内存空间 xff0c 因此不必
  • kaldi新手入门及语音识别的流程(标贝科技)

    kaldi新手入门及语音识别的流程 标贝科技 欢迎体验标贝语音开放平台 地址 xff1a https ai data baker com source 61 qaz123 xff08 注 xff1a 填写邀请码hi25d7 xff0c 每日
  • 结构体字节对齐详解【含实例】

    一 前言 结构体字节对齐属于老生常谈的问题 xff0c 看似简单 xff0c 却很容易忘记 而且因为结构体使用的普遍性 xff0c 使得字节对齐也成为了一个不得不谈的话题 二 什么是结构体字节对齐 假设现在有一个结构体如下 xff0c 问你
  • Mina基础(五):编写自定义协议及编解码器

    为什么要制定协议呢 xff1f 我们知道 xff0c 底层传输的都是二进制数据 xff0c 服务端和客户端建立连接后进行数据的交互 xff0c 接受这对方发送来的消息 xff0c 如何判定发送的请求或者响应的数据结束了呢 xff1f 总不能
  • c++之存储类

    C 43 43 存储类 存储类定义 C 43 43 程序中变量 函数的范围 xff08 可见性 xff09 和生命周期 这些说明符放置在它们所修饰的类型之前 下面列出 C 43 43 程序中可用的存储类 xff1a autoregister
  • STM32串口通信 中断配置

    一 关于如何配置通过中断的方式配置串口的收发 xff0c 一共就是这8个步骤 1 使能串口时钟 使能GPIO时钟 2 引脚复用映射 3 GPIO端口模式设置 4 串口参数初始化设置 5 开启中断初始化NVIC 6 使能串口 7 编写中断处理
  • altium designer导出bom表和贴片图

    altium designer的简单使用 xff0c 做一下记录 1 导出bom表 xff0c https jingyan baidu com article cb5d6105133e8f005c2fe0fe html 2 导出贴片图 xf
  • 基于RPLIDAR激光雷达开发无人机机载室内二维重建装置(2)——RPLIDAR测试

    从官网上 xff08 http www slamtec com xff09 下载开发用的SDK及数据手册等相关资料 xff0c 但Arduino相关资料貌似已失效 xff0c 之后尝试从其他渠道下载 先安装对应系统的驱动 xff0c 之后打
  • Visio2016与office2016安装解决方法终极版

    基本解决方案 删除注册表 office软件在我们日常生活中的应用十分广泛 xff0c 在购买电脑时大部分会给电脑装上office家庭版 xff0c 但是有些人由于工作需要可能使用office更多的功能 xff0c 因此可以选择安装专业版 而
  • 微带天线学习

    微带天线学习 侧馈矩形微带天线同轴馈电矩形微带天线双频微带天线 学习方法是根据HFSS软件学习微带天线的优化 参数计算 xff0c 以及根据HFSS仿真结果进一步理解微带天线中参数对天线性能的影响 微带天线贴片尺寸计算方法及matlab代码
  • Zotero IEEE trans期刊cls格式调整

    Zotero IEEE trans期刊cls格式调整 Zotero软件自带的IEEE期刊的引用格式不符合期刊投稿要求 xff0c 因此需要改变cls文件 xff0c 改变引用格式 cls格式编辑网站 xff1a https editor c
  • ADS2021安装

    1 ADS简介 先进设计系统 Advanced Design system xff08 ADS xff09 Agilent Technologies 是领先的电子设计自动化软件 xff0c 适用于射频 微波和信号完整性应用 2 ADS的安装
  • Mysql整体介绍(适用于5.X版本)(上)(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 Mysql整体介绍 xff08 适用于5 X版本 xff09 标贝科技 Mysql 8