
获得徽章 1
- #青训营笔记创作活动#
2月2日 打卡day20
根据文章作者总结与阅读文章标注重点,该篇文章的要点如下:
引入索引机制后,给数据库带来的优势很明显:
①整个数据库中,数据表的查询速度直线提升,数据量越大时效果越明显。
②通过创建唯一索引,可以确保数据表中的数据唯一性,无需额外建立唯一约束。
③在使用分组和排序时,同样可以显著减少SQL查询的分组和排序的时间。
④连表查询时,基于主外键字段上建立索引,可以带来十分明显的性能提升。
⑤索引默认是B+Tree有序结构,基于索引字段做范围查询时,效率会明显提高。
⑥从MySQL整体架构而言,减少了查询SQL的执行时间,提高了数据库整体吞吐量。
但对数据库整体来说,索引带来的优势会大于劣势。不过也正由于索引存在弊端,因此索引不是越多越好,合理建立索引才是最佳选择。展开赞过评论1 - #青训营笔记创作活动#
2月1日 打卡day19
根据文章作者总结与阅读文章标注重点,该篇文章的要点如下:
Bytebase是一款面向开发者的数据库变更管理工具,让开发人员在没有客户端的情况下也能方便地进行数据库管理,它的SQL审核功能可以避免开发人员对数据库的误操作。不仅可以方便地在线可视化管理数据库,还支持SQL审核和备份恢复。
· 项目地址:link.juejin.cn
· 主要特性如下:
1.SQL审核:具有一站式SQL审核面板,可以直观地看到数据库所有变更记录。
2.SQL建议:能自动检查SQL语句规范,额外提供GitHub Action和API接入方式。
3.SQL编辑器:可以在线管理及查看数据库表,支持语法的自动提示。
4.GitOps工作流:支持集成GitHub和GitLab,使用GitOps工作流进行数据库变更。
5.备份恢复:支持自动备份数据库及恢复数据。
Bytebase的环境功能可用于区分不同环境下的实例,比如测试环境和生存环境,可用于设置数据库变更是否需要人工审核以及数据库的自动备份策略。展开赞过评论1 - #青训营笔记创作活动#
1月31日 打卡day18
根据文章作者总结与阅读文章标注重点,该篇文章的要点如下:
1.慢SQL优化思路
慢查询日志记录慢SQL
explain分析SQL的执行计划
profile 分析执行耗时
Optimizer Trace分析详情
确定问题并采用相应的措施
2.临时表的排序是怎样的
把需要排序的字段放到sort buffer,排完就返回,排序分全字段排序和rowid排序。如果是全字段排序需要查询返回的字段,都放入sort buffer,根据排序字段排完直接返回;如果是rowid排序只需把排序的字段放入sort buffer,然后多一次回表操作再返回。
3.如何优化order by的文件排序
order by使用文件排序效率会低一点。怎么优化?因为数据是无序的所以就需要排序。如果数据本身是有序的就不再用文件排序。而索引数据本身是有序的则可以通过建立索引来优化order by语句。还可以通过调整max_length_for_sort_data、sort_buffer_size等参数优化。展开赞过评论1 - #青训营笔记创作活动#
1月30日 打卡day17
根据文章作者总结与阅读文章标注重点,该篇文章的要点如下:
(1)一条SQL是如何诞生的?
SQL语句都诞生于客户端,主要有两种方式产生一条SQL,一种是由开发者自己手动编写,另一种则是相关的ORM框架自动生成,一般情况下,MySQL运行过程中收到的大部分SQL都是由ORM框架生成的,比如Java中的MyBatis、Hibernate框架等。
(2)一条SQL执行前会经历的过程
为了SQL能够正常执行,首先会先去获取一个数据库连接对象,MySQL连接层中会维护着「连接池」。
(3)一条SQL执行完成后是如何返回的
一条「读SQL」或「写SQL」执行完成后,由于SQL操作的属性不同,两者之间也会存在差异性,MySQL执行一条查询SQL时,数据是逐条返回的模式,因为如果等待所有数据全部查出来之后再一次性返回,必然会导致撑满内存。不过这里的返回并不是指返回客户端,而是指返回SQL接口,因为从磁盘中检索出目标数据时,一般还需要对这些数据进行再次处理。展开赞过评论1 - #青训营笔记创作活动#
1月28日 打卡day16
根据文章作者总结与阅读文章标注重点,该篇文章的要点如下:
· 一般情况下5xx的状态码其实并不是服务器返回给客户端的,而是由网关返回的,常见的网关如nginx。
· HTTP状态码用来表示响应结果的状态,其中200是正常响应,4xx是客户端错误,5xx是服务端错误。
· 客户端和服务端之间加入nginx,可以起到反向代理和负载均衡的作用,客户端只管向nginx请求数据,并不关心这个请求具体由哪个服务器来处理。
· 后端服务端应用如果发生崩溃,nginx在访问服务端时会收到服务端返回的RST报文,然后给客户端返回502报错。502并不是服务端应用发出的,而是nginx发出的。因此发生502时,后端服务端很可能没有没有相关的502日志,需要在nginx侧才能看到这条502日志。
· 如果发现502,优先通过监控排查服务端应用是否发生过崩溃重启,如果是的话,再看下是否留下过崩溃堆栈日志,如果没有日志,看下是否可能是oom或者是其他原因导致进程主动退出。如果进程也没崩溃过,去排查下nginx的日志,看下是否将请求打到了某个不知名IP端口上。展开赞过评论1 - #青训营笔记创作活动#
1月27日 打卡day15
根据文章作者总结与阅读文章标注重点,该篇文章的要点如下:
1.注释尽可能全面、有意义
接口方法、类、复杂的业务逻辑,都应该添加有意义的注释。
- 对于接口方法的注释,应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述。
- 类的注释应该包含类的功能说明、作者和修改者。
- 业务逻辑很复杂的代码非常有必要写清楚注释。
**有利于后面的维护**。
2.项目拆分合理的目录结构
可以根据不同的业务划分模块,比如建一个`moudles`包,然后按订单、登陆等业务划分,每个业务都有自己的`controller、service、mapper、entity`。
**让项目结构更清晰,可读性更强,更容易维护**
3.封装方法形参
如果你的方法参数过多,要封装一个对象出来。
4.封装通用模板
一个优秀的后端开发,应该具备封装通用模板的编码能力。展开赞过评论1 - #青训营笔记创作活动#
1月26日 打卡day14
根据文章作者总结与阅读文章标注重点,该篇文章的要点如下:
(1)转发的思想:
有A、B、C三台计算机:
· A和C并没有相连但经过了B。
· A计算机可以先发到B计算机,再让B计算机转发C计算机
(2)标识的思想:
如果同时有多台计算机互联通信,就需要为每台计算机设定唯一的物理地址——MAC地址
(3)集线器:
要让每一台计算机既能够方便和另一台计算机相隔远距离的通信,又要避免计算机之间两两相连的电线太多。
通过加多中间设备——集线器,将互联的计算机都连接到集线器来做转发。
(4)交换机:
交换机作为新的一种中间设备,实现了数据的全双工的通信,计算机在发送的时候同时也可以进行数据的接收,在这个链路上的数据也不再会产生冲突。展开赞过评论1 - #青训营笔记创作活动#
1月25日 打卡day13
根据文章作者总结与阅读文章标注重点,该篇文章的个人认为的要点如下:
一、MySQL整体结构浅析
从上往下依次会分为网络连接层、系统服务层、存储引擎层、以及文件系统层,往往编写SQL后,都会遵守着MySQL的这个架构往下走。
二、网络连接层
当一个客户端尝试与MySQL建立连接时,MySQL内部都会派发一条线程负责处理该客户端接下来的所有工作。
而数据库的连接层负责的就是所有客户端的接入工作,MySQL的连接一般都是基于TCP/IP协议建立网络连接,因此凡是可以支持TCP/IP的语言,几乎都能与MySQL建立连接。
MySQL还支持另一种连接方式,就是Unix系统下的Socket直连,但这种方式一般使用的较少。
三、系统服务层
MySQL大多数核心功能都位于系统服务层,包括客户端SQL请求解析、语义分析、查询优化、缓存以及所有的内置函数(例如:日期、时间、统计、加密函数...),所有跨引擎的功能都在这一层实现,譬如存储过程、触发器和视图等一系列服务。
四、存储引擎层
存储引擎是MySQL最重要的一层,服务层中聚集了MySQL所有的核心逻辑操作,而引擎层则负责具体的数据操作以及执行工作。
五、文件系统层
1.日志模块
在MySQL中主要存在七种常用的日志类型,如下:
①binlog二进制日志,主要记录MySQL数据库的所有写操作(增删改)。
②redo-log重做/重写日志,MySQL崩溃时,对于未落盘的操作会记录在这里面,用于重启时重新落盘(InnoDB专有的)。
③undo-logs撤销/回滚日志:记录事务开始前[修改数据]的备份,用于回滚事务。
④error-log:错误日志:记录MySQL启动、运行、停止时的错误信息。
⑤general-log常规日志,主要记录MySQL收到的每一个查询或SQL命令。
⑥slow-log:慢查询日志,主要记录执行时间较长的SQL。
⑦relay-log:中继日志,主要用于主从复制做数据拷贝。
2.数据模块
MySQL的所有数据最终都会写入到磁盘,而不同的数据在磁盘空间中,存储的格式也并不相同。展开赞过评论1 - #青训营笔记创作活动#
1月24日 打卡day12
根据文章作者总结与阅读文章标注重点,该篇文章的个人认为的要点如下:
1. HTTPS会对HTTP的URL和Request Body都进行加密,直接在抓包软件如Wireshark中是无法直接查看加密内容的。
2. HTTPS握手的过程中会先通过非对称加密去交换各种信息,其中就包括3个随机数,再通过这三个随机数去生成对称机密的会话秘钥,后续使用这个会话秘钥去进行对称加密通信。
3.获得三个随机数:
如果能获得这三个随机数就能解密HTTPS的加密数据包,因此需要完整的加密过程的数据包记录才能获取这三个随机数。
· 三个随机数:分别是客户端随机数(client random)、服务端随机数(server random)、pre_master_key;前两个是明文,第三个是被服务器公钥加密过的,在客户端侧需要通过设置环境变量SSLKEYLOGFILE去导出。
4.导出获取密钥并解密
通过设置SSLKEYLOGFILE环境变量,再让curl或chrome会请求HTTPS域名,会让它们在调用TLS库的同时导出对应的sslkey文件。
这个特殊的密钥文件里包含了三列,其中最重要的是第二列的client random信息以及第三列的pre_master_key。
第二列client random用于定位,第三列pre_master_key用于解密。
接下来利用wireshark等软件就可以解密内容了。
另外,在CTF也能看到类似的题目解法...展开赞过评论1 - #青训营笔记创作活动#
1月23日 打卡day11
根据文章作者总结与阅读文章标注重点,该篇文章的个人认为的要点如下:
一、规范命名
类、属性、方法、参数命名应当遵循以下几点:
· 见名知意
· 能够读的出来
二、规范代码格式
好的代码格式应当遵守以下几点:
· 合适的空格
· 代码对齐,比如大括号要对齐
· 及时换行,一行不要写太多代码
三、规范注释
好的注释应当满足一下几点:
· 解释代码的意图,说明为什么这么写,用来做什么
· 对参数和返回值注释,入参代表什么,出参代表什么
· 有警示作用,比如说入参不能为空,或者代码是不是有坑
· 当代码还未完成时可以使用 todo 注释来注释
四、抽取重复代码
可以抽取成一个工具类,还可以抽成一个公共的父类。
五、尽量不要重复造轮子
一般对于已经有开源的项目并且已经做得很好的时候,比如Hutool,就可以把轮子直接拿过来用了。
六、使用设计模式优化代码
在平时开发中,使用设计模式可以增加代码的扩展性。
七、不滥用设计模式
用好设计模式可以增加代码的扩展性,但是滥用设计模式确是不可取的。展开赞过评论1