MySQL基础架构
所属分类 mysql
浏览量 1400
Server层
包括连接器、查询缓存、分析器、优化器和执行器等
涵盖MySQL的大多数核心服务功能,以及所有的内置函数
所有的跨存储引擎的功能都在这一层实现,例如存储过程、触发器和视图等
存储引擎层负责数据的存储和提取,插件式
支持InnoDB、MyISAM和Memory等存储引擎
最常用为InnoDB(Since 5.5.5,默认)
客户端
连接器 管理连接 权限验证
分析器 词法语法分析
查询缓存
优化器 执行计划生成 索引选择
执行器
存储引擎
mysql -h$host -P$port -u$user -p
mysql是客户端工具,用来与服务端建立连接
在完成TCP三次握手之后,连接器开始认证身份
如果账号密码不对,客户端会收到Access denied for user错误
如果账号密码认证通过,连接器会到权限表里查询拥有的权限
之后在这个连接里的权限判断,都依赖于此时读取的权限
因此即使用管理员账号对权限进行修改,也不会影响到已经存在连接的权限
连接完成后,如果没有后续的动作,该连接就会处于空闲状态
可以通过show processlist命令查看,Command=Sleep表示是一个空闲连接
如果客户端太长时间没有操作,连接器会自动将其断开,由参数 wait_timeout 控制,默认为8小时
连接被断开之后,客户端再次发送请求后,会收到错误
Lost connection to MySQL server during query
需要重新连接,然后再执行请求
数据库层面的长连接和短连接
长连接:在连接成功后,如果客户端持续有请求,则一直使用同一连接
建立连接的过程比较复杂,推荐使用
短连接:每次执行完很少的几次查询后就会断开连接,下次查询再重新建立连接
全部使用长连接后,MySQL的占用内存可能会涨的很快
MySQL在执行过程中临时使用的内存是在连接对象里面管理的,这些资源在连接断开时才会释放
长时间累计,可能会占用大量内存,导致OOM被系统强行Kill掉,表现为MySQL异常重启
解决方案
定期断开长连接。可以减小 wait_timeout,或者在程序中控制 ,执行过占用大内存的查询,断开连接
从MySQL 5.7开始,可以在每次执行较大的操作后,执行mysql_reset_connection来初始化连接资源
该过程不需要重新建立连接和重新做权限校验,只会将连接恢复到刚刚创建完时的状态
show processlist;
connect_timeout wait_timeout interactive_timeout
SHOW VARIABLES LIKE '%connect_timeout%'
show variables like 'wait_timeout';
SHOW VARIABLES LIKE '%interactive_timeout%';
查询缓存
查询缓存往往弊大于利
查询缓存容易失效,对表任何更新操作,这个表上的所有查询缓存都会失效
对更新频繁的场景来说,查询缓存的命中率很低
查询缓存比较适合读多写极少的场景,例如系统配置表
query_cache_type
A value of 0 or OFF prevents caching or retrieval of cached results
A value of 1 or ON enables caching except of those statements that begin with SELECT SQL_NO_CACHE
A value of 2 or DEMAND causes caching of only those statements that begin with SELECT SQL_CACHE
MySQL 8.0删除了查询缓存功能
mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
分析器
词法分析
SQL语句 token 分析
通过select关键字识别出这是一个查询语句
将T识别成表名,将ID识别成列名
语法分析
根据词法分析的结果,语法分析会根据语法规则,判断SQL是否满足MySQL语法
如果不满足,将会收到 You have an error in your SQL syntax 错误
优化器
分析器处理之后,MySQL已经能理解要做什么,开始执行之前,需要经过优化器处理
在表里存在多个索引的时候,选择使用哪个索引
在多表关联的时候,决定各个表的连接顺序
确定语句的执行方案,然后进入执行器阶段
执行器
执行器负责语句的具体执行
首先会判断是否有执行权限,如果没有就返回权限错误,SELECT command denied to user
如果命中查询缓存,也会在查询缓存返回结果的时候,做权限验证
优化器之前也会调用 precheck 验证权限
如果有权限,那么将打开表继续执行
打开表的时候,执行器会根据表的引擎定义,去调用引擎提供的接口
假设表T中,ID字段没有索引,执行器的执行流程如下
调用InnoDB的引擎接口,获取表的第一行,判断ID是否为10
如果不是则跳过,如果是则将这行存放在结果集中
调用引擎接口获取下一行,重复上面的判断逻辑,直到获取到表的最后一行
执行器将上面遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端
rows_examined
数据库的慢查询日志会有rows_examined字段
在执行器每次调用引擎获取数据行的时候累加的(+1)
有些场景,执行器调用一次,但在引擎内部则是扫描了很多行
例如在InnoDB中,一页有很多行数据
因此,引擎扫描行数(引擎内部真正扫描的次数)跟rows_examined并不完全相同
慢查询
mysql> SHOW VARIABLES LIKE '%slow_query%';
+---------------------+-----------------------------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/mysql/xxx/slowlog/slowlog.log
上一篇
下一篇
elasticsearch5.0使用RequestBody搜索接口
科创板首批人工智能公司信息
CAP和一致性协议
java应用oom被kill排查记录
proc中进程内存信息
进程内存占用分析VSS/RSS/PSS/USS