MySQL数据库及计算机网络学习 | 青训营笔记

82 阅读7分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

今日学习了计算机网络以及MySQL数据库相关内容。

TCP和UDP辨析

  • UDP适用场景

    • UDP的存在,本质是内核提供的一个最小网络传输功能

      很多时候,大家虽然号称自己用了UDP,但实际上都很忌惮它的丢包问题,所以大部分情况下都会在UDP的基础上做各种不同程度的应用层可靠性保证。比如王者农药用的KCP,以及最近很火的QUIC(HTTP3.0),其实都在UDP的基础上做了重传逻辑,实现了一套类似TCP那样的可靠性机制

  • 极特殊的情况下会出现TCP的速度反而比UDP的速度要快的情况

    • 如果现在我需要传一个特别大的数据包。在TCP里,它内部会根据MSS的大小分段,这时候进入到IP层之后,每个包大小都不会超过MTU,因此IP层一般不会再进行分片。这时候发生丢包了,只需要重传每个MSS分段就够了。但对于UDP,其本身并不会分段,如果数据过大,到了IP层,就会进行分片。此时发生丢包的话,再次重传,就会重传整个大数据包。这样速度就更慢。
  • 总结

    • TCP为了实现可靠性,引入了重传机制、流量控制、滑动窗口、拥塞控制、分段以及乱序重排机制。而UDP则没有实现,因此一般来说TCP比UDP快。

      TCP是面向连接的协议,而UDP是无连接的协议。这里的"连接"其实是,操作系统内核在两端代码里维护的一套复杂状态机。

      大部分项目,会在基于UDP的基础上,模仿TCP,实现不同程度的可靠性机制。比如王者农药用的KCP其实就在基于UDP在应用层里实现了一套重传机制。

      对于UDP+重传的场景,如果要传超大数据包,并且没有实现分段机制的话,那数据就会在IP层分片,一旦丢包,那就需要重传整个超大数据包。而TCP则不需要考虑这个,内部会自动分段,丢包重传分段就行了。这种场景下,其实TCP更快。

MySQL相关

  • 常见SQL语句

    • DML:数据库操作语句,比如update、delete、insert等都属于这个分类。
    • DDL:数据库定义语句,比如create、alter、drop等都属于这个分类。
    • DQL:数据库查询语句,比如最常见的select就属于这个分类。
    • DCL:数据库控制语句,比如grant、revoke控制权限的语句都属于这个分类。
    • TCL:事务控制语句,例如commit、rollback、setpoint等语句属于这个分类
  • 存储过程和触发器的区别

    • [存储过程]的本质就是一段预先写好并编译完成的SQL,而我们要聊的触发器则是一种特殊的存储过程,但[触发器]与[存储过程]的不同点在于:存储过程需要手动调用后才可执行,而触发器可由某个事件主动触发执行。在MySQL中支持INSERT、UPDATE、DELETE三种事件触发,同时也可以通过AFTER、BEFORE语句声明触发的时机,是在操作执行之前还是执行之后
    • [MySQL触发器]就类似于Spring框架中的AOP切面。
  • 注意区分缓冲区和查询缓存

    • 缓冲区:为了通过内存的速度来弥补磁盘速度较慢对数据库造成的性能影响。在数据库中读取某页数据操作时,会先将从磁盘读到的页存放在缓冲区中,后续操作相同页的时候,可以基于内存操作。
    • 查询缓存:对结果对象的缓存,实际上在高版本的情况下被舍弃
    • 同时缓冲区是与存储引擎有关的,不同的存储引擎实现也不同,比如InnoDB的缓冲区叫做innodb_buffer_pool,而MyISAM则叫做key_buffer
  • MySQL常见的七种日志文件

    • binlog二进制日志,主要记录MySQL数据库的所有写操作(增删改)。
    • redo-log重做/重写日志,MySQL崩溃时,对于未落盘的操作会记录在这里面,用于重启时重新落盘(InnoDB专有的)。
    • undo-logs撤销/回滚日志:记录事务开始前[修改数据]的备份,用于回滚事务。
    • error-log:错误日志:记录MySQL启动、运行、停止时的错误信息。
    • general-log常规日志,主要记录MySQL收到的每一个查询或SQL命令。、
    • slow-log:慢查询日志,主要记录执行时间较长的SQL
    • relay-log:中继日志,主要用于主从复制做数据拷贝
  • MySQL常见的文件形式

    • db.opt文件:主要记录当前数据库使用的字符集和验证规则等信息。

      .frm文件:存储表结构的元数据信息文件,每张表都会有一个这样的文件。

      .MYD文件:用于存储表中所有数据的文件(MyISAM引擎独有的)。

      .MYI文件:用于存储表中索引信息的文件(MyISAM引擎独有的)。

      .ibd文件:用于存储表数据和索引信息的文件(InnoDB引擎独有的)。

      .ibdata文件:用于存储共享表空间的数据和索引的文件(InnoDB引擎独有)。

      .ibdata1文件:这个主要是用于存储MySQL系统(自带)表数据及结构的文件。

      .ib_logfile0/.ib_logfile1文件:用于故障数据恢复时的日志文件。

      .cnf/.iniMySQL的配置文件,Windows下是.ini,其他系统大多为.cnf

网络原理相关

  • 集线器和交换机的区别

    • 集线器收到即转发,意味着集线器其实是没有记录每台设备的标识的,那么就是将数据广播出去,让计算机设备自己判断消息是不是属于它自己的,所以集线器简单的同时,工作效率也很低。
    • 交换机内部维护着一张MAC地址与网线端口的对应表。当接收到数据时,会将相应的端口号码和发送方MAC地址写入表中,这样就可以根据地址判断出该设备连接在哪个端口上了。而交换机可以不用进行广播,而是根据这些信息判断应该把数据转发到哪里。
  • 路由器功能

    • 路由器所连接的范围更广,网络和网络之间的连接就是通过路由器;计算机所发出的网络数据,都是先经过集线器和交换机进行区域的汇总,然后才转发给路由器;这样一步步连接到互联网的。
    • 所以路由器跟交换机不同的是,在路由器里维护的是路由表,在路由表中最重要的是目的网络地址(也就是IP)和下一跳地址。所以路由通过根据目的网络地址来确定下一跳路由器。最终找到目的主机所在目的网络上的路由器,只到最后一个路由器时,才试图向目的主机进行直接交付。
    • 而路由器也是实现分组交换的关键构件,负责转发收到的分组,是网络核心部分最重要功能。
  • 集线器,交换机,路由器位置

    • 集线器是一层设备,(对应OSI网络模型,集线器就是工作在物理层)
    • 交换机属于二层设备(对应OSI网络模型,也就是在数据链路层)
    • 路由器是三层设备(对应OSI网络模型在网络层)