Mysql的逻辑架构

看了一些网友的文章,在此对Mysql架构做个总结。

下面一张图基本涵盖了Mysql的架构(图片来源网络,)

Mysql 从大的逻辑将分为 Server 层 、 存储引擎层

Server 层

server 层涵盖了大部分Mysql的核心功能 , 包括 连接器,查询缓存、分析器、优化器、执行器,执行函数。 可以说所有的跨存储引擎的功能都在这一层实现

连接器

要想连接到Mysql,首先就要和连接器打交道。

连接器负责: 接入客户端连接,获取权限,连接管理

手动连接服务器语法

mysql -uusername -pusername -hhost 

连接上之后可以用 以下命令查看连接状态

show processlist

+----+-----------------+-----------------+------+---------+--------+------------------------+------------------+
| Id | User            | Host            | db   | Command | Time   | State                  | Info             |
+----+-----------------+-----------------+------+---------+--------+------------------------+------------------+
|  5 | event_scheduler | localhost       | NULL | Daemon  | 681018 | Waiting on empty queue | NULL             |
|  8 | root            | localhost:55499 | NULL | Query   |      0 | init                   | show processlist |
+----+-----------------+-----------------+------+---------+--------+------------------------+------------------+

如果Mysql 处于空闲状态, 则 Command 的状态是 Sleep , Command 命令的全部状态,参考: https://dev.mysql.com/doc/refman/5.7/en/thread-commands.html

如果一个连接太长时间处于Sleep状态, 就会被Mysql强行断开, 控制断开的超时时间 为 wait_timeout 参数, 默认是 28800s (8小时)

show variables like 'wait_timeout'
mysql 的长短连接

长连接: 客户端有持续的请求从而导致连接不断开

短连接: 每次执行完有限几个语句后断开, 下次重新请求连接

一般mysql建立连接比较复杂耗时,如果对时间比较敏感, 最好选择长连接

不过长连接有个坏处,就是Mysql在执行过程中临时内存是分配在连接对象上的, 这些内存只有在断开连接的时候才会被释放,如果一直连续查询,内存涨的就比较快。

以上问题的解决方案:

  1. 定期端口长连接
  2. 如果是Mysql5.7及以上版本, 执行一个比较大的操作后,通过执行 mysql_reset_connnection 来重新初始连接资源,这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚创建的状态

(这里有一个疑惑,我们平时用的池化技术应该属于长连接范围, 既然Mysql长连接需要 msyql_reset_connection 去执行重新连接资源, 那么我们平时用的各种连接池,比如 HikariPool 是如何做到 的呢)

查询缓存

查询缓存 在每次更新表数据的时候, 整个表的缓存都会被清空, 所以这个很可能起不到缓存的作用

在Mysql8.0 及之后的版本 查询缓存是关闭状态,即使是5.6(windows版本) 默认也是关闭状态, 保持缓存关闭就好

#mysql8.0执行
show variables like 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | NO    |
+------------------+-------+
1 row in set, 1 warning (0.01 sec)

#mysql5.6执行
show variables like 'have_query_cache'

mysql> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+
1 row in set (0.01 sec)

#mysql 5.6执行默认是关闭的
mysql> show variables like 'query_cache_type';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| query_cache_type | OFF   |
+------------------+-------+
1 row in set (0.00 sec)

不过即使是关闭状态,我们也可以在sql语句中显示执行sql_cache , 来表明我们需要使用缓存, 这种情况多数用于很少变化的表

#例子表
create table a(id int primary key auto_increment, name varchar(32) )Engine=InnoDB default charset=utf8;
##使用sql_cache查询
select sql_cache * from a where id=1;

分析器

根据输入的语句,来进行语法分析和词法分析

词法分析 就会提取关键字, 如表名, select 等等

语法分析 会分析 写的语句是否符合mysql语法, 不符个直接报错

优化器

优化器和索引息息相关 , 如果一个sql语句有多个索引, mysql 会根据执行效率 来确定如何排列组合条件查询

执行器

执行器主要作用是生成执行计划, 比如查看是否索引,有则走索引, 没有则全表扫描等

存储引擎层

Mysql 的存储引擎 就是 如何 存储数据的一层, Mysql 的存储引擎是插件式的, 可以支持多种存储引擎, 其中包括InnoDB, MyISAM 等, 其中InnoDB 存储引擎 在Mysql5.6之后就成了Mysql的默认存储引擎。 其主要原因是 InnoDB 支持事务, 行锁等, 可以说InnoDB满足绝大部分数据处理的场景。

参考资料: https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=mysql 架构&step_word=&hs=0&pn=17&spn=0&di=7108135681917976577&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=2133789819%2C71225611&os=3472432157%2C445308428&simid=3393713368%2C466640995&adpicid=0&lpn=0&ln=1369&fr=&fmq=1660191134621_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=https%3A%2F%2Fgimg2.baidu.com%2Fimage_search%2Fsrc%3Dhttp%3A%2F%2Fimgedu.lagou.com%2F9246ced379964cdb8bdcbd9f5d298bc4.jpg%26refer%3Dhttp%3A%2F%2Fimgedu.lagou.com%26app%3D2002%26size%3Df9999%2C10000%26q%3Da80%26n%3D0%26g%3D0n%26fmt%3Dauto%3Fsec%3D1662783140%26t%3D22cc7ff0e30238f748609dfadb418d32&fromurl=ippr_z2C%24qAzdH3FAzdH3Fooo_z%26e3Bsw257_z%26e3Bv54AzdH3Fs2j17w6ptvsjAzdH3F0dnc8_z%26e3Bip4s&gsm=12&rpstart=0&rpnum=0&islist=&querylist=&nojc=undefined&dyTabStr=MCwzLDEsNiw0LDUsNyw4LDIsOQ%3D%3D [文中图片来源]

https://dev.mysql.com/doc/refman/5.7/en/show-processlist.html [show processlist 命令解释]

https://xmmarlowe.github.io/2021/05/21/数据库/MySQL长连接、短连接、连接池/ [MySQL长连接、短连接、连接池]

https://dev.mysql.com/doc/refman/5.6/en/query-cache-in-select.html [sql_cache 官方解释]

posted on 2022-08-13 21:01  指尖,写不尽  阅读(43)  评论(0编辑  收藏  举报

导航