MYSQL_04SQL在MySQL中是如何执行的
2023-04-13 14:47:12 10 举报
AI智能生成
MySQL中是如何执行的
作者其他创作
大纲/内容
内部组件结构
Server层
连接器
建立连接的工作就是有连接器完成的
客户端要向mysql发起通信都必须先跟Server端建立通信连接
开发当中我们大多数时候用的都是长连接,把连接放在Pool内进行管理
长连接导致MySQL占用内存解决方案
定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连
通过执行mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态
查询缓存
MySQL拿到一个查询请求后,会先到查询缓存看看
以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果
查询缓存往往弊大于利
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空
对于更新压力大的数据库来说,查询缓存的命中率会非常低
建议在静态表里使用查询缓存
极少更新的表,比如,一个系统配置表、字典表,那这张表上的查询才适合使用查询缓存
配置参数
my.cnf参数query_cache_type
0代表关闭查询缓存OFF
1代表开启ON
2(DEMAND)代表当sql语句中有SQL_CACHE关键词时才缓存
select SQL_CACHE* from test where ID=5;
查看当前mysql实例是否开启缓存机制
show global variables like "%query_cache_type%"
监控查询缓存的命中率
show status like '%Qcache%'; //查看运行的缓存信息
mysql8.0已经移除了查询缓存功能
分析器
如果没有命中查询缓存,就要开始真正执行语句了
词法分析器原理
词法分析
语法分析
语义分析
构造执行树
生成执行计划
计划的执行
优化器
表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序
执行器
开始执行的时候,要先判断一下你对这个表T有没有执行查询的权限
如果没有,就会返回没有权限的错误
如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用precheck验证权限
Store层
存储引擎层负责数据的存储和提取
存储引擎
InnoDB
MyISAM
Memory
bin-log归档
SQL执行时,会将sql语句的执行逻辑记录在我们的bin-log当中
binlog是Server层实现的二进制日志,他会记录我们的cud操作
特点
Binlog在MySQL的Server层实现(引擎共用
Binlog为逻辑日志,记录的是一条语句的原始逻辑
Binlog不限大小,追加写入,不会覆盖以前的日志
配置
配置开启binlog
binlog‐format=ROW
#binlog格式,有3种statement,row,mixed
sync‐binlog=1
#表示每1次执行写入就与硬盘同步,会影响性能,为0时表示,事务提交时mysql不做刷盘操作,由系统决定
binlog命令
show variables like '%log_bin%'
查看bin‐log是否开启
flush logs
会多一个最新的bin‐log日志
show master status
查看最后一个bin‐log日志的相关信息
reset master
;清空所有的bin‐log日志
查看binlog内容
/usr/local/mysql/bin/mysqlbinlog
binlog里的内容不具备可读性,所以需要我们自己去判断恢复的逻辑点位
begin-commit之间的信息是一个完整的事务逻辑
再根据位置position判断恢复即可
0 条评论
下一页