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