mysql 软件架构
ps:最近在了解Mysql。发一篇自己写的笔记。希望能帮助到小伙伴们。
客户端
mysql的客户端 比如 jdbc odbc cli 这些客户端
连接器
连接器就是接受客户端通过tcp发来的指令,比如select * from z88j limit 5000; 先分发给缓存。
缓存(mysql8.0之后取消缓存功能)
mysql缓存的机制
比如上一秒刚查询过 select * from z88j limit 5000; 指令。他会把指令查询出的结果用KV形式保存再服务器内存中。再次运行相同sql不需要再去解析,优化和执行sql。
mysql缓存机制在什么时候失效?
在表的结构或数据发生改变时,查询缓存中的数据不在有效了。查询的缓存值相关内容也将被清空。而且 INSERT UPDATE DELETE TRUNCATE ALTER TABLE、DROP TABLE 、DROP DATABASE 都会导致缓存数据失效。
一般什么场景会用到?
对于更新频繁的表,查询缓存并不合适。但是对于一些不变的数据且有大量相同sql查询的表,查询缓存可以提高查询性能。比如:游戏按day分表后的游戏日志表。还有分表后的订单表。一般数据都很少会更新。
命中的条件是什么?
缓存以hash表的方式存在 服务器内存里面,以sql、和数据库名还有客户端协议等作为Key。
在判断命中前,mysql 不会去解析sql ,而是使用sql 去查询缓存。而且sql上的任何字符不同比如空格 注释都会导致缓存不命中,查询不确定的数据,也不会被缓存的 比如 like now() 这一类查询结果都不会被缓存。
Mysql8.0 为什么会取消缓存呢?
虽然MYSQL Query Cache 能很大成都提高命中的sql的查询性能,但是他只有在命中缓存后查询效果才有所改善,因此无法预测性能。
还有就是:查询缓存最大问题他会受到单个互斥锁的保护。在具有多核服务器上,大量查询会导致大量的互斥锁争用。所以现在Mysql5.6 默认禁用 8取消缓存。经过大量测试情况。建议把缓存放到客户端(比如redis 或者 Memcached)让专门处理kv 缓存的数据库去搞。
想详细了解可以百度:mysql缓存机制
分析器
分析器有什么作用?
对指令进行语法分析和词法分析,分析sql 语句的结构是什么样子的,有没有嵌套,分析出你要干什么。然后再给优化器去处理。
优化器
优化器是干什么的?
优化器的主要工作就是如何使用索引进行工作。优化器并不是十全十美的,也有缺陷,我们要知道优化器的缺陷在哪里,再写sql。把查询性能达到最优。比如:join 查询怎么走索引怎么连表查。
执行器
执行器的作用?
执行器进一步分析指令,做出执行计划,然后调用 innoDB 或者 MyISAM ,Archive。对系统文件读取和写入操作。还有就是校验权限此用户对数据是否有权限读取或修改。
存储引擎
存储引擎的主要是干什么的?
存储引擎的任务是将执行器的指令落实到数据文件上,不同的储存引擎的原理和执行方法有很大不同。比如:存储的数据结构。运行方式
常见的存储引擎有哪些?
- 可以看https://www.z88j.com/39354.html 文章。有详细介绍
Mysql 软件架构执行流程
Mysql客户端通过TCP发送指令给缓存,缓存如果不命中。然后分析器进行分析给优化器。然后再给执行器。然后给对应的数据库引擎比如innodb 然后对文件系统进行读取和写入操作!(最终还是通过文件系统进行读取和写入操作的。)
Mysql 能看成什么架构?
首先是分层架构
- 客户端是第一层 :前端或客户端
- 连接器第二层 :针对连接,接收连接
- 缓存 分析器 优化器执行器 是三层 :sql层 service层。主要就是处理sql
- 存储引擎是四层 :存储引擎
- 文件系统是五层。:读写
管道过滤器架构
- 分析器 -> 优化器 -> 执行器 可以看做管道过滤架构
微核架构
- 可以吧左边看成软件主体核心,右边插件部分。多一个插件(innodb)多一个功能,也就是所谓微核架构。
- 其实严格来说:连接器 缓存 分析器 优化器 执行器 是mysql 本体。右边的 innodb引擎 MyISAM等等引擎属于插件。可以想象成 vscode 的各种插件。
对架构不懂的可以看:https://www.z88j.com/39331.html (数据库软件中典型的几种架构)之前写的一篇文章 。
而且一个大型软件有很多架构。从微观可以看做微核 管道架构,从宏观可以看做分层架构。不要局限于单一的架构思想(重点思想,看事情要多方面)研究问题要有清晰的事业,分清除宏观和微观等等。
下面是画的流程图:
原创文章,作者:星辰,如若转载,请注明出处:http://www.z88j.com/39340.html