今日总结

学习了页分裂和页合并的过程,页分裂主要是新增了一个元素,导致数据库中的存放的页元素已经满了,所以要页分裂,比较影响性能,页合并是删除了一些元素,导致页的利用率不是很高,以至于进行页合并。实现:页分裂是修改上一层节点的索引值(新增),然后新增一张页;页合并,也是修改上一层的索引(删除),然后合并两个页或者多个页。页分裂消耗性能,空间利用率比较低。

学习了索引查找过程,回表是什么?主键索引,叶子节点存放整行数据,二级索引叶子结点存放索引值和主键id,二级索引找到后,需要到主键索引树中,取得整行数据,这就是回表。

学习了覆盖索引;;;优点;;1、避免了回表;;2、避免了myIsam表的系统调用;;3、优化缓存,减少磁盘操作

复习了索引失效的10种情况;;;1、加减乘除;;2、or有可能;;3、NOT、NOT IN 、!=等等;;4、函数调用;;5、隐式的数据转换;;6、字符转换;;7、不符合最左匹配原则;;8、mysql优化器决定;;9、like的全开区间;;10、索引为null,查询is not null,索引失效。

学习了索引下推;;MySQL5.6版本之后,才提出来的。。。目的;;减少了回表的次数;;实现;;发生在联合索引中,一个字段被找到后,需要多另一个字段进行过滤,这样可以就减少回表的次数。

学习MySQL的缓存;;对于之前查过的sql语句,将sql语句和结果以K-V的形式存在内存,要注意的是,sql语句的每一个字符都需要一样,就算只是功能一样,但是字符存在大小写变换,就不能使用缓存集。缓存在MySQL5.x版本中默认禁用,在MySQL8.x版本中进行了移除,因为在实际生产环境中,不建议开启缓存,如果每一次查询的结果都是不同的话,开启缓存的性能会下降13%,当然实际应用场景不会这么变态。缓存的主要目的;;减少磁盘操作次数。对于sql语句和结果有比较严格的要求,sql语句必须要一模一样,结果集必须要明确,就算查询一样的sql语句,结果也有可能不一定一样。还有一种就是结果集超过了query_cache _limit的阈值。

对于缓存失效的情况,就是说,对于表的任何表更新操作或数据更新操作都一定会导致缓存失效,如果开启缓存,会对性能有一定损耗。

 

学习了面试中,1、架构的局限性,怎么通过合适的方案解决这种局限性;;2、对于关键性组件,了解里面的原理以及最佳实现;;3、了解系统设计问题的核心,如何实现使用使用合适的组件。

 

学习了如何描述自己项目;;1、描述系统特点;;2、理解核心问题;;3、提出主要的方案;;4、根据面试官的回馈来回答;;

 

学习一下spring事务传播;;REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED;常用的事务传播有 PROPAGATION_REQUIRED 支持事务,如果当前没有事务,则新建事务,如果有事务,则会加入事务, REQUIRES_NEW:新建事务,如果当前存在事务,则把当前事务挂起。这个方法会独立提交事务,不受调用者的事务影响,父级异常,它也是正常提交;;;

 

学习了netty模型;;netty本质上就是reactor模式的变种实现,selector作为多路复用器,evenloopgroup作为分发器,pipleLine作为处理器。但是netty使用了串行化处理,并在pipleline中使用了责任链模式。netty中的buffer在java的nio的buffer上做了优化,提高了性能。

 

复习了netty中的线程模型:1、有两个线程分别是BossEvenLoopGroup和WorkEvenLoopGroup,两个都是NIOEvenLoopGroup类型的,其本质是一个事件循环组,其中都包含着很多的evenloop事件,每一个evenloop事件中都有一个selector,用其监听绑定在socket上的网络通讯。;;2、bossevenloop用来监听accpet事件,如果发生了,就将相应的serversocketchannel发给workevenloongroup,然后work的evenloop事件中selector轮询是否有读写事件的发生,发生了就处理io操作,在对应的任务队列中处理,处理所有的任务;;;

 

学习了reactor模型,类似生产者和消费者模型,但有区别的是reactor模型没有缓存队列,来了一个请求,直接将这个请求发给相对应的handler处理。这是单线程。多线程reactor模型是为了解决任务比较多的情况。主从reactor模型是在多线程的基础上,做了一个分离,用main来接收accpet请求,用work来处理io操作;但是main线程只有一个,work线程是一个线程池;

 

学习了io模型的同步和异步、阻塞和非阻塞;IO请求其实有两个步骤;1、发起IO请求;;2、实际的IO操作;阻塞和非阻塞主要是发起IO请求之后,请求线程是否会发生阻塞,即是是是否会在第一个IO请求的时候阻塞;;;同步和异步;区别就在于线程是否会在第二个步骤阻塞,即实际IO操作的时候。

学习了同步阻塞、同步非阻塞、异步阻塞、异步非阻塞、分别代表着BIO、NIO、NIO、AIO

学习了RabbitMQ来实现分布式事务-分布式事务的实现为: 大事务 = 小事务 + MQ

 

学习了本地缓存和redis缓存:使用缓存的初衷是为了减少缓存操作的代码和业务逻辑的解耦,在需要对查询结果进行缓存的地方,使用注解Cacheable标记

学习了使用缓存的主要目的是为了降低数据库压力;;其次是提高了访问速度;;

学习了如何手写一个mybatis的框架;;;1、定义注解;更新OrmUpdate、删除OrmDelete、新增OrmInsert、查询OrmSelect的注解;;还有方法中的参数OrmParam注解;;;2、定义util类,类中有几大重要的方法;2.1、连接数据库的参数设置;2.2、加载数据库的驱动类;;2.3、建立数据库连接;;2.4、检查连接是否有效;;2.5、释放连接资源;;2.6、不同的语句执行不同的操作,操作数据库的sql语句;;2.7、创建statement对象、preparedstatement对象(带参数占位符的sql语句对象);;2.8、开启事务、提交事务、回滚事务;;2.9、获取查询结果集;;2.10、判断数据类型,主要Data、String、TimeStamp类型,对其进行一定的转变;;;3、创建动态代理对象sqlSession对象,主要功能是与sql进行交互的;;invoke方法中,判断该方法是什么操作(updata、select、delete、insert),最终还是调用util类里面的方法;;;4、对sql语句进行增强功能;;

 

学习了更新、删除、插入、查询是对一行数据或者多行数据进行操作;;;select * from user where  ;;;update user set id = 1 where id = 22;;;delete from user where id = 1;;;;insert into user (id, name) values (1, "xiaoh"),其中mybatis中的需要传入的参数用#号加一个花括号,括号里面是传入的参数名称,一般和表里的数据列名称对应;;;

 

学习了mysql调优,做法:;;1、业务层的优化;;;2、代码层的优化;;;3、sql层面的优化(包含索引优化);;;4、硬件层面的优化;运维方面的优化;;;举个例子,十几亿的数据,怎么查询?如果一个用户进行数据分页查询,都要做count,而count的性能不高,有加锁的操作;1、从业务层来说,把count单独拎出来,直接查询count列就可以啦。2、从代码层面,可以将sql结果的count进行保存到一个单独的表中,存放表名、count、id主键。count的慢可以解决了。每次对表进行新增或者删除,都会异步地更新这个表的内容;;;;3、sql层,建立联合索引,减少回表。连表查询中的表数量很多的时候,索引怎么建立都不太行了,这时候需要在代码层进行优化,可以写成两个sql,查询的数据进行拼接。

复习了tcp的三次握手和四次挥手;;三次握手;发送方发送一个syn的请求报文,其中seq序号设为x,此为第一握手,接收方确认了发送方的发送能力和自己的接收能力,而发送方都不能确认什么。接收方收到报文之后,会回复一个ACK报文和SYN报文,seq设置y,ack为x+ 1,这是对发送方的回复,第二次握手,接收方确实了自己的接受能力,确实了发送方的发送接收能力。发送方收到之后,会回复一个ACK报文,ack序号为y + 1,这是对接收方的回复,第三次握手,接收方确定了自己的接收发送能力,发送方确认了自己的发送接收能力。至此三次握手结束。

为什么是三次握手呢?因为两次握手的话,不能保证tcp双方的接收和发送能力是否正常,四次握手的话,资源会被浪费。

四次挥手,第一次;;;主动方发送FIN报文,seq设置x,第二次;;;被动方收到报文后,回复一个ACK,ack置为x + 1, 这是对主动方的回复,第三次;;;此时,过了一段时间后,被动方的数据发送完了,也发出了FIN报文,Seq设置为y,第四次;;;主动收到之后回复ACK报文,ack为y+ 1,。,需要注意的是主动方此时需要等待2MSL时间,主要是为了防止回复的ack报文会存在丢失,被动方不能收到主动方的请求。也为了防止下一次创建tcp连接的时候,有失效的报文存在。

为什么要四次挥手呢?三次也可以,只不过需要时机很凑巧,被动方收到FIN报文的同时,数据已经发送完成了,此时,直接回复FIN和ACK报文,seq = y,ack = x + 1,来请求断开连接。

同样的,五次挥手的话,浪费资源和时间。

 

posted @   牵魂  阅读(39)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示