SQL执行流程、SQL执行计划、SQL优化

select查询语句

select查询语句中join连接是如何工作的?

1、INNER JOIN
返回两个表中的匹配行。
2、LEFT JOIN
返回左表中的所有记录以及右表中的匹配记录。
3、RIGHT JOIN
返回右表中的所有记录以及左表中的匹配记录。
4、FULL OUTER JOIN
返回左侧或右侧表中有匹配的所有记录。

select查询语句执行顺序

SQL查询语句的执行顺序以及JOIN的使用。作为一种声明式编程语言,SQL的执行顺序和我们编写的语句顺序并不完全相同。

    理解SQL的执行顺序,有助于使用者更好地优化查询语句,提高查询效率。此外,SQL中的JOIN语句是非常重要和常用的,用于关联多个表进行查询。

    SQL是一种声明式的编程语言。这意味着使用者在编写SQL查询语句时,只需要指定想要的结果,而不需要关心具体的实现步骤。数据库系统会根据最优的执行计划来执行使用者的查询。

  1. SELECT DISTINCT Table1., Table2.
  2. FROM
  3. Table1 JOIN Table2 ON matching_condition
  4. WHERE constraint_expression
  5. GROUP BY [columns]
  6. HAVING constraint_expression
  7. ORDER BY [columns] LIMIT count
  8. select distinct s.id
  9. from T t join S s on t.id=s.id
  10. where t.name="zhouxx"
  11. group by t.mobile
  12. having count(*)>2
  13. order by s.create_time
  14. limit 5;

  1. 按照的顺序:
  2. 1. FROM & JOIN: 集合的交并补,即上面的join连接操作
  3. FROM子句:确定数据来源,包括JOIN的表 ON子句:执行JOIN条件。 JOIN子句:如果有的话,根据JOIN类型(如INNERLEFT)连接表:
  4. Left 左表为基础表,右表对应数据不存在则为Null,形成新的虚拟表
  5. RIGHT 右表为基础表,左表对应数据不存在则为Null,形成新的虚拟表
  6. 首先根据FROM后边的前两个表做一个笛卡尔积生成虚拟表table1,对应步骤1中的from
  7. 然后根据ON语句的条件对table1进行筛选生成table2,对应步骤1中的on
  8. 然后根据连接关键字LeftRightOuter等,对table2进行补充形成table3,对应步骤1中的join
  9. 如果超过两张表就重复1-3最终形成虚拟表table4
  10. 2. WHERE: 过滤记录
  11. 对上一步得到的中间结果集进行过滤。
  12. 通过where语句进行筛选,形成虚拟表table5,对应步骤2
  13. 条件是订单的创建时间(create_time)在'2023-01-01''2023-12-31'之间。
  14. 这一步删除了不在指定时间范围内的订单数据。
  15. 3. GROUP BY: 根据指定的列分组记录
  16. 就对table5分组形成 虚拟表table6,对应步骤3
  17. 将上一步的结果集按照用户所在地区(region)进行分组。
  18. 这一步将相同地区的用户订单信息聚合在一起。
  19. 4. HAVING: 过滤分组GROUP BY
  20. 对分组后的结果集进一步过滤。
  21. 条件是每个地区的总订单金额大于1000000
  22. 这一步删除了消费总额不满足条件的地区。
  23. 5. SELECT: 选取特定的列
  24. DISTINCT子句:去除重复数据。
  25. 函数:对列做特殊运算
  26. 选择结果集中需要保留的列,包括地区(region)和总金额(total_amount)。
  27. 其中总金额是通过SUM(o.amount)计算得到的。
  28. 6. ORDER BY: 最后对结果进行排序
  29. 执行order by子句,此时返回的一个游标,对应步骤6
  30. 按照总金额(total_amount)对结果集进行倒序排序。
  31. 这一步将消费总额高的地区排在前面。
  32. 7. LIMIT:
  33. LIMIT/OFFSET子句(或者是TOP,或者是FETCH):最后的结果截取。
  34. 限制结果集的数量为10
  35. 这一步返回消费总额最高的前10个地区。
  36. ============================================================
  37. 一 、select语句关键字的定义顺序:
  38. select distinct <select_list>
  39. from <left_table>
  40. <join_type> join
  41. on <join_condition>
  42. where <where_condition>
  43. group by <group_by_list>
  44. having <having_condition>
  45. order by <order_by_condition>
  46. limit <limit_number>
  47. 二 、 select语句关键字的执行顺序:
  48. (7) select
  49. (8) distinct <select_list>
  50. (1) from <left_table>
  51. (3) <join_type> join <right_table>
  52. (2) on <join_condition>
  53. (4) where <where_condition>
  54. (5) group by <group_by_list>
  55. (6) having <having_condition>
  56. (9) order by <order_by_condition>
  57. (10) limit <limit_number>
  58. 第一步 执行 from 知道先从<left_table>这个表开始的
  59. 第二步 执行 on 过滤 根据 <join_condition> 这里的条件过滤掉不符合内容的数据
  60. 第三步 执行 join 添加外部行
  61. -------- inner join 找两张表共同的部分
  62. --------- left join 以左表为准,找出左表所有的信息,包括右表没有的
  63. --------- right join 以右表为准,找出左表所有的信息,包括左表没有的
  64. --------- #注意:mysql不支持全外连接 full JOIN 可以用union
  65. 第四步 执行 where 条件 where后加需要满足的条件,然后就会得到满足条件的数据
  66. 第五步 执行 group by 分组 当我们得到满足where条件后的数据时候,group by 可以对其进行分组操作
  67. 第六步 执行 having 过滤 havinggroup by 通常配合使用,可以对 满足where条件内容进行过滤
  68. 第七步 执行 select 打印操作 当以上内容都满足之后,才会执行得到select列表
  69. 第八步 执行 distinct 去重 得到select列表之后,如果指定有 distinct ,执行select后会执行 distinct去重操作
  70. 第九步 执行 order by 排序 以上得到select列表 也经过去重 基本上就已经得到想要的所有内容了 然后就会执行 order by 排序asc desc
  71. 第十步 执行 limit 限制打印行数,我们可以用limit 来打印出我们想要显示多少行。

select语句疑惑问题

分析完mysql的执行顺序,很明显别名不可以在join on中使用,因为join on在select之前就执行了,但是我又产生了新的疑问:

  1. select在group by之后执行,为什么group by中可以使用别名?
  2. 用on筛选和用where筛选有什么区别?
  3. order by在select之后,为什么order by可以用select中未选择的列呢?

问题1:select在group by之后执行,为什么group by中可以使用别名?

mysql官网也没有给出具体原因


但目前可以确定的是:select肯定在group by之前执行了一次,可以理解成在原有顺序的基础上的预加载,也就是说对于mysql,每一次运行代码,实际上执行了至少两次select

问题2:用on筛选和用where筛选有什么区别?

on和where的最大区别在于,如果在on应用逻辑表达式那么在第三步join中还可以把移除的行再次添加回来,而where的移除的最终的;

问题3:order by在select之后,为什么order by可以用select中未选择的列呢?

没找到答案,希望大佬可以解惑。

SQL解析器构思元数据并产出影响与血缘分析

通过该解释器将ETL的SQL 全部解析

ETL名称:in 、out、表、字段、条件 的结构。最后将这些结构连起来就是一个血缘图。下图是完整SQL元数据结构部分模型

图片

其主要的内容可以简单理解为,将SQL语句解析为语法分析树,然后通过Toke序列转化为语法分析树,最终抽象语法树被传递给错误检查和语义分析阶段进行处理。

  • SQL语句:用户或应用程序提交一个或多个SQL语句给数据库执行。

  • SQL语句解析:数据库接收到SQL语句后,会对其进行词法和语法分析。词法分析将SQL语句分解成一个个Token(如关键字、标识符、运算符等),语法分析则根据SQL语法规则验证这些Token序列是否构成一个有效的SQL语句

  • 生成语法树:如果SQL语句通过了词法和语法检查,解析器会根据语句的结构生成一棵语法树。语法树以树形结构表示SQL语句各个语法单元之间的关系,叶子节点对应SQL语句中的原子元素如表名、列名、值等,非叶节点则对应各种SQL子句如SELECT、FROM、WHERE等

  • 语义分析:语法树生成后还需进行语义检查,如检查表和列是否存在,列之间的数据类型是否匹配等

MySQL架构

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

  • 连接器、查询缓存、解析器、预处理器、优化器、执行器
  • 内置函数:日期、事件、数学、加密函数
  • 跨存储引擎的功能:存储过程、触发器、视图

存储引擎负责数据的存储和提取

  • InnoDB(5.5版本开始默认引擎)
  • MyISAM
  • Memory

我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。

连接器

  • 建立连接(TCP三次握手、四次挥手)
  • 管理连接
  • 校验用户身份

如果一个用户已经建立了连接,即使管理员中途修改了该用户的权限,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。

查询缓存

如果 SQL 是查询语句(select 语句),MySQL 就会先去查询缓存( Query Cache )里查找缓存数据,看看之前有没有执行过这一条命令,这个查询缓存是以 key-value 形式保存在内存中的,key 为 SQL 查询语句,value 为 SQL 语句查询的结果。

如果查询的语句命中查询缓存,那么就会直接返回 value 给客户端。如果查询的语句没有命中查询缓存中,那么就要往下继续执行,等执行完后,查询的结果就会被存入查询缓存中。

MySQL 8.0 版本直接将查询缓存删掉了,也就是说 MySQL 8.0 开始,执行一条 SQL 查询语句,不会再走到查询缓存这个阶段了。对于 MySQL 8.0 之前的版本,如果想关闭查询缓存,我们可以通过将参数 query_cache_type 设置成 DEMAND。

解析SQL

解析器

  • 词法分析,构建出 SQL 语法树

    SQL语法树

  • 语法分析,判断 SQL 语句是否满足 MySQL 语法(关键字拼写错误)

执行SQL

预处理器

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

优化器

优化器主要负责将 SQL 查询语句的执行方案确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引。


主键索引

  • 属于聚簇索引,索引和数据一块储存
  • InnoDB只有主键索引才能是聚簇索引

所谓的聚簇索引,就是一个节点就是整个的一行数据。我们平常见到的二叉树数据结构像这样

  1. struct TreeNode {
  2. int val;
  3. TreeNode *left;
  4. TreeNode *right;
  5. TreeNode() : val(0), left(nullptr), right(nullptr) {}
  6. TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  7. TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  8. };

数据结构中只有左右指针和当前节点的值,可以根据节点的值建立二叉搜索树。代入到聚簇索引的定义中,根据主键建立B+树,就像二叉搜索树左孩子val小于自己,右孩子大于自己。数据结构储存更多的东西,把表中一行的所有内容都作为成员变量存起来。找到了主键的节点,也就找到了这一行的所有数据。

非聚簇索引则是使用索引项建立B+树,例如根据年龄、名字等,节点里面则储存着对应行的主键。比如我要查询年龄大于21岁的人,并且年龄这一列拥有索引(显然应该是非聚簇的,因为年龄可能重复)。抽象地,我们认为把年龄进行了排序,我们仅能看到一群年龄从小到大,而不知道这些人是谁。我们把大于21岁人拉过来,挨个撕开他们的面纱,也就是他们的主键,才知道是谁。非聚簇索引只储存主键,如果要查询那一行的其他信息,则要根据主键再进行查询,也就是用上面的那个聚簇索引,找到了主键就找到了那一行的所有值。这称为回表查询。

非聚簇索引不一定进行回表查询。覆盖索引即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了, 而无需回表查询。

用户准备使用 SQL 查询用户名,而用户名字段正好建立了索引。那么这个索引的 key 本身就是 name,查到对应的 name 直接返回就行了,无需回表查询。(是不是很神奇?这不废话吗

二级索引

二级索引又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。二级索引都是非聚簇索引。

  • 唯一索引(Unique Key)
  • 普通索引(Index)
  • 前缀索引(Prefix)

回到优化器,举一个例子:

select id from product where id > 1 and name like 'i%';

product 表有主键索引(id)和普通索引(name)。这条查询语句的结果既可以使用主键索引,也可以使用普通索引,但是执行的效率会不同。这时,就需要优化器来决定使用哪个索引了。

很显然这条查询语句是覆盖索引,直接在二级索引就能查找到结果(因为二级索引的 B+ 树的叶子节点的数据存储的是主键值),就没必要在主键索引查找了,因为查询主键索引的 B+ 树的成本会比查询二级索引的 B+ 的成本大,优化器基于查询成本的考虑,会选择查询代价小的普通索引。

执行器

在执行的过程中,执行器和存储引擎交互,交互是以记录为单位的。

  • 主键索引查询

select * from product where id = 1;

存储引擎通过主键索引的 B+ 树结构定位到 id = 1的第一条记录,如果记录是不存在的,就会向执行器上报记录找不到的错误,然后查询结束。如果记录是存在的,就会将记录返回给执行器;

执行器从存储引擎读到记录后,接着判断记录是否符合查询条件(其他查询条件,这一步只是满足了主键的条件),如果符合则发送给客户端,如果不符合则跳过该记录。

  • 全表扫描

存储引擎把一条记录取出后就将其返回给执行器(Server层),执行器继续判断条件,不符合查询条件即跳过该记录,否则发送到客户端;

Server 层每从存储引擎读到一条记录就会发送给客户端,之所以客户端显示的时候是直接显示所有记录的,是因为客户端是等查询语句查询完成后,才会显示出所有的记录

  • 索引下推

MySQL 5.6 推出的查询优化策略。索引下推能够减少二级索引在查询时的回表操作,提高查询的效率,因为它将 Server 层部分负责的事情,交给存储引擎层去处理了。

select * from t_user where age > 20 and reward = 100000;

联合索引当遇到范围查询 (>、<) 就会停止匹配,也就是 age 字段能用到联合索引,但是 reward 字段则无法利用到索引。

那么,不使用索引下推(MySQL 5.6 之前的版本)时,执行器与存储引擎的执行流程是这样的:

  1. Server 层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录,也就是定位到 age > 20 的第一条记录;
  2. 存储引擎根据二级索引的 B+ 树快速定位到这条记录后,获取主键值,然后进行回表操作,将完整的记录返回给 Server 层;
  3. Server 层在判断该记录的 reward 是否等于 100000,如果成立则将其发送给客户端;否则跳过该记录;
  4. 接着,继续向存储引擎索要下一条记录,存储引擎在二级索引定位到记录后,获取主键值,然后回表操作,将完整的记录返回给 Server 层;
  5. 如此往复,直到存储引擎把表中的所有记录读完。

可以看到,没有索引下推的时候,每查询到一条二级索引记录,都要进行回表操作,然后将记录返回给 Server,接着 Server 再判断该记录的 reward 是否等于 100000。

而使用索引下推后,判断记录的 reward 是否等于 100000 的工作交给了存储引擎层,过程如下 :

  1. Server 层首先调用存储引擎的接口定位到满足查询条件的第一条二级索引记录,也就是定位到 age > 20 的第一条记录;
  2. 存储引擎定位到二级索引后,先不执行回表操作,而是先判断一下该索引中包含的列(reward列)的条件(reward 是否等于 100000)是否成立。如果条件不成立,则直接跳过该二级索引。如果成立,则执行回表操作,将完成记录返回给 Server 层。
  3. Server 层在判断其他的查询条件(本次查询没有其他条件)是否成立,如果成立则将其发送给客户端;否则跳过该记录,然后向存储引擎索要下一条记录。
  4. 如此往复,直到存储引擎把表中的所有记录读完。

可以看到,使用了索引下推后,虽然 reward 列无法使用到联合索引,但是因为它包含在联合索引(age,reward)里,所以直接在存储引擎过滤出满足 reward = 100000 的记录后,才去执行回表操作获取整个记录。相比于没有使用索引下推,节省了很多回表操作。

MySQL执行sql语句的流程

贴一个全的图:添删改查语句执行过程

1.1:连接器(Connection Manager)

MySQL 的执行流程始于连接器。当客户端请求与 MySQL 建立连接时,连接器负责处理这些连接请求。它验证客户端的身份和权限,然后分配一个线程来处理该连接。MySQL 每个连接线程会创建一个会话(session),在这个会话中,客户端可以发送 SQL 语句进行增删改查等操作。

连接器的主要职责就是:

  • ①负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行,其中mysql在与客户端连接TC/IP的
  • ②验证请求用户的账户和密码是否正确,如果账户和密码错误,会报错:Access denied for user 'root'@'localhost' (using password: YES)
  • ③如果用户的账户和密码验证通过,会在mysql自带的权限表中查询当前用户的权限:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二维码如何用来存储图片?扫码看图有哪些好处

现在通过二维码来分享图片是一种很常见的方法&#xff0c;二维码可以承载大量的图片内容&#xff0c;从而节省对图片空间容量的占用&#xff0c;并且将图片放入二维码中便于分享让图片传递变得更加方便快捷&#xff0c;那么图片生成二维码具体该怎么操作呢&#xff1f;通过下面…

MySQL----初始数据类型

前言 一、tinyint 范围&#xff1a;-128-----127 在MySQL中&#xff0c;整型可以指定是有符号的和无符号的&#xff0c;默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的。如果我们向mysqlt特定的类型中插入不合法的数据&#xff0c;Mysq一般会直接拦截&#xff0c…

云计算实训06——find、stat、touch、tree、scp、crontab指令相关应用

一、find命令 1.find的作用&#xff1a;对文件进行搜索 2. 基本语法&#xff1a; find [文件路径] [选项 选项的值 ] 3.常见的选项 -name 根据文件的名称搜索文件&#xff0c;支持通配符 * -type f 代表普通文件&#xff0c;-type d 代表目录 4.* 通配符 在 linux 系统…

多多OJ评测系统 前端页面通用布局开发与优化 调整布局

目录 我们重新布局样式 个人习惯写一个最外层的样式 Header Content Footer 布局出来了 加上标签和容器 绑定样式 我们设置一些样式 页面展示效果 我们加入导航栏 搜索组件 我们这边把导航菜单抽象成一个公共的组件 引入好 页面中成功进行了展示 我们可以把这边替…

MySQL添加索引时会锁表吗?

目录 简介Online DDL概念Online DDL用法总结 简介 在MySQL5.5以及之前的版本&#xff0c;通常更改数据表结构操作&#xff08;DDL&#xff09;会阻塞对表数据的增删改操作&#xff08;DML&#xff09;。 MySQL5.6提供Online DDL之后可支持DDL与DML操作同时执行&#xff0c;降低…

【Vue】深入了解 Axios 在 Vue 中的使用:从基本操作到高级用法的全面指南

文章目录 一、Axios 简介与安装1. 什么是 Axios&#xff1f;2. 安装 Axios 二、在 Vue 组件中使用 Axios1. 发送 GET 请求2. 发送 POST 请求 三、Axios 拦截器1. 请求拦截器2. 响应拦截器 四、错误处理五、与 Vuex 结合使用1. 在 Vuex 中定义 actions2. 在组件中调用 Vuex acti…

免费【2024】springboot OA公文发文管理系统

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

js 实现扫雷游戏,源码开放,支持npm引入使用

本人开发的js版本扫雷游戏 体验地址 | Github Minesweeper game Sponsors Install and use npm i minesweeper-gameimport {Map} from minesweeper-game;const map new Map();Reset Map map.reset();TS Statement interface IMapOptions {width?: number; // Map sizeh…

数据实时获取方案之Flink CDC

目录 一、方案描述二、Flink CDC1.1 什么是CDC1.2 什么是Flink CDC1.3 其它CDC1.4 FlinkCDC所支持的数据库情况 二、使用Pipeline连接器实时获取数据2.1 环境介绍2.2 相关版本信息2.3 详细步骤2.3.1 实时获取MySQL数据并发送到Kafka2.3.2 实时获取MySQL数据并同步到Doris数据库…

初识C++|模板初阶

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 目录 &#x1f349;1. 泛型编程 &#x1f349;2. 函数模板 &#x1f95d;2.1 函数模板概念 &#x1f95d;2.2 函数模板格式 &#x1f95d;2.3 函数模板的原理 &#x1f95…

万界星空科技QMS系统:全面赋能企业质量管理的创新引擎

万界星空科技质量管理QMS系统&#xff08;Quality Management System&#xff09;是一套全面、高效的质量管理工具&#xff0c;旨在帮助企业提升产品质量、优化生产流程、降低质量成本。该系统集成了多个功能模块&#xff0c;以满足企业在质量管理方面的各种需求。以下是万界星…

【网络安全科普】勒索病毒 防护指南

勒索病毒简介 勒索病毒是一种恶意软件&#xff0c;也称为勒索软件&#xff08;Ransomware&#xff09;&#xff0c;其主要目的是在感染计算机后加密用户文件&#xff0c;并要求用户支付赎金以获取解密密钥。这种类型的恶意软件通常通过电子邮件附件、恶意链接、下载的软件或漏洞…

JavaWeb JavaScript ① JS简介

目录 一、HTML&CSS&JavaScript的作用 二、前后端关联标签——表单标签 1.form标签 2.input标签 3.get/post提交的差异 4.表单项标签 5.布局相关标签 块元素——div 行内元素——span 三、CSS 1.CSS引入方式 方式1 行内式 方式2 内嵌式 方式3 外部样式表 2.CSS选择器 元…

Zabbix监控介绍与部署

目 录 一、zabbix介绍和架构 1.1 zabbix介绍 1.2 为什么需要监控 1.3 需要监控什么 二、zabbix使用场景与系统概述 2.1 zabbix的功能 2.2 zabbix架构 2.3 Zabbix术语 三、编译安装zabbix 3.1 安装依赖环境 3.2 建立管理用户 3.3 准备源码包&#xff0c;解压包 3.…

封装网络请求 鸿蒙APP HarmonyOS ArkTS

一、效果展示 通过在页面直接调用 userLogin(params) 方法&#xff0c;获取登录令牌 二、申请网络权限 访问网络时候首先需要申请网络权限&#xff0c;需要修改 src/main 目录下的 module.json5 文件&#xff0c;加入 requestPermissions 属性&#xff0c;详见官方文档 【声明权…

鸿蒙 next 5.0 版本页面跳转传参 接受参数 ,,接受的时候 要先定义接受参数的类型, 代码可以直接CV使用 [教程]

1, 先看效果 2, 先准备好两个页面 index 页面 传递参数 import router from ohos.routerEntry Component struct Index {Statelist: string[] [星期一, 星期二,星期三, 星期四,星期五]StateactiveIndex: number 0build() {Row() {Column({ space: 10 }) {ForEach(this.list,…

【Git远程操作】向远程仓库推送 | 拉取远程仓库

目录 1.向远程仓库推送 ​1.1本地仓库的配置 1.2remote-gitcode本地仓库 1.3推送至远程仓库 2.拉取远程仓库 现阶段以下操作仅在master主分支上。 1.向远程仓库推送 工作区☞add☞暂存区☞commit☞本地仓库☞推送push☞远程仓库注意&#xff1a;本地仓库的某个分支 ☞推…

《Techporters架构搭建》-Day01 第一个RESTful API接口

微服务架构搭建 搭建微服务架构分析一下项目的build.gradle添加Demo接口 搭建微服务架构 首先搭建系统管理模块&#xff0c;模块结构如下 tps-cloud └── tps-system -- 系统管理模块└── tps-system-api -- 系统管理模块公共api模块└── tps-system-biz -- 系统管理模…

单片机设计_自行车码表(AT89C51, LCD1602, DS1302,霍尔传感器)

想要更多项目私wo!!! 一、电路设计 系统采用51单片机LCD1602液晶DS1302时钟模块霍尔传感器电机按键模块蜂鸣器报警模块设计而成。 产品自带单片机上电复位电路、手动复位电路&#xff08;复位按键&#xff09;、晶振电路&#xff08;给单片机提供时钟周期&#xff09;。 …

Zabbix介绍和架构

目录 一.Zabbix简介 1.为什么需要监控 2.需要监控什么 3.常见的监控工具 4.Zabbix使用场景及系统概述 5.Zabbix 架构 6.Zabbix工作流程 7.Zabbix 术语 二. 部署安装zabbix 三.zabbix 配置文件 一.Zabbix简介 1.为什么需要监控 运维行业有句话:“无监控、不运维”&am…