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在执行过程中临时内存是分配在连接对象上的, 这些内存只有在断开连接的时候才会被释放,如果一直连续查询,内存涨的就比较快。
以上问题的解决方案:
- 定期端口长连接
- 如果是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://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 官方解释]
微信公众号