Mysql基础知识扫盲

221 阅读5分钟

mysql的基本软件架构

简单理解为 mysql的客户端-----mysql server端------文件系统,其中mysql的客户端 其实就是jdbc,讲白了就是数据库的驱动,不同语言实现的不一样,但是都是一个意思。 mysql server端 就是就是负责将 客户端发来的指令 进行解析 然后 写入到 对应的操作系统的文件系统里,仅此而已。 宏观上我们这么理解就可以了。

对于 mysql的server端来说,其实就是分为下面4层(更多人喜欢将2和3 一起 命名为sql层

  1. 连接器(负责与客户端进行tcp连接)
  2. 缓存(mysql 8以后就几乎没有了,5.x版本 就是你之前刚查过的内容我就不查了,直接给你在缓存中返回)
  3. 分析器-优化器-执行器 (负责解析客户端传来的sql语句,然后准备执行这些指令,特别像责任链模式吧)
  4. 存储引擎(innodb myisam archive)

最后就是落地到对应的文件系统中

mysql的连接

mysql的 tcp 通讯协议 大概分下面几个步骤

  1. 三次握手 建立tcp连接
  2. 认证连接
  3. 认证通过后,客户端和服务端可以开始交互
  4. 断开mysql连接
  5. 4次挥手 断开tcp连接

注意 在这里 第一步和第五步 都是 网络协议tcp自己完成的,跟mysql 毫无关系,我们也不会讲这里的东西,主要关注 其中的234 这3个步骤即可

首先看下 第二步 认证连接

  1. 服务端-客户端: 发送握手初始化包

当tcp连接建立以后,首先是mysql的服务端给客户端发一个初始化包,这里很像 我们去餐厅吃饭,首先说话的肯定是服务员,

  1. 客户端-> 服务端: 发送验证 讲白了 这里就是发下用户名和密码

  2. 服务端-> 客户端: 发送结果

命令的执行步骤:

1.客户端-> 服务端: 发送命令包(command packet) 2.服务端-》客户端: 发送回应包

断开mysql连接:

1.客户端-》服务端: 发送断开连接的包

mysql的tcp报文格式

可以使用 wireshark来分析mysql的报文,但是这里要注意了,wireshark 默认是 3306的mysql端口

我这里使用的是一个3309的端口 所以要去wireshark 那里更改一下:

image.png

image.png

显然从上图中可以看出来 tcp的3次握手,以及握手成功以后 mysql server端主动发送的消息

掌握了个这个技巧 有兴趣的就可以 对照网上的资料 来分析 mysql的报文格式了

mysql 的查询缓存

  1. 之前执行过的语句 会以sql语句为key 查询结果为value 存储在缓存中
  2. 后面的查询语句到来的时候会查找之前 执行过的相同的语句

看上去很好,但是 这里面有个硬伤是 如果你的表有了修改,那么所有缓存都会被删除。

这个就很尴尬了,这会导致 缓存命中的效率极低,所以mysql后面 也不推荐使用缓存了,并且在8.0以后 这个功能直接被干掉了

分析器,优化器,执行器

分析器的作用主要就是 要知道 你这条sql语句 到底要干啥?

1.先做词法分析,识别sql语句中的关键字 2.句法分析,判断sql语句 是否符合语法

分析器做完了以后 工作就交给 优化器

优化器的作用是要知道 怎么做?

主要工作是决定如何使用索引

比如一个表 有主键索引 还有辅助索引,到底用哪个 不用哪个 先用哪个 后用哪个 都是这个优化器来决定的

最后一个执行器的作用

就是 校验权限,调用存储引擎

执行器首先会校验用户对目标数据有没有权限,比如对某个表 有没有写权限,有没有读权限 等等

最后执行器会以行为粒度,调用存储引擎,执行sql

如果没有索引,执行器就会按照主建,循环查询所有行。(效率极低)

存储引擎

存储引擎的任务就是 将执行器的指令落实在数据文件上

不同的存储引擎的原理和执行方法有很大的不同

MyISAM存储引擎

这个是mysql的5.5.5之前的默认存储引擎, 但是这货 不支持事务

优点 插入数据快,空间利用率高

InnoDB存储引擎

这是目前使用最多的 存储引擎,Mysql 其实就靠这个翻身的。他支持了事务

另外还有优点:

支持崩溃修复能力(有日志支持)和并发控制

Memory存储引擎

这个就是数据都站在存储在内存中, 速度快,但是缺点就是安全性差,断电就没了。。。一般就用这个东西来建一些临时表

有点像redis,当然redis是nosql了。

有了redis以后 这个其实也用的很少了。

Archive 存储引擎

优点;数据压缩,空间利用率高,插入速度快 缺点: 不支持索引 事务 查询性能也很差。

没有索引的查询 就只能从头到尾去扫描了。 速度奇慢

存储引擎 总结

基本上InnoDb 默秒全,当然也有例外:

1.查询效率要求非常高的,可以考虑MyISAM, 2.日志信息归档可以考虑Archive 3.临时表可以考虑Memory