mysql学习总结

查询sql语句的执行过程:

总的mysql逻辑架构图:如图:
在这里插入图片描述
客户端 + mysql
mysql分为Server层 和 引擎层
Server层:查询缓存、分析器、优化器、执行器等 以及所有内置的函数(eg:日期、时间、数学和加密函数等)
所有跨存储引擎的功能都在这一层实现,eg:存储过程、触发器、视图
查询缓存:mysql拿到一个查询后,先查询缓存,(缓存保存形式KV(K为查询的语句,V为查询的结果))
但建议关闭查询缓存(show variables like ‘%query_cache_type%’; set GLOBAL query_cache_type=‘OFF’;)
失效频繁,而且对于压力大的数据库,命中率非常低。mysql8.0版本取消了查询缓存的整个功能模块。
分析器:词法分析:识别出里面的字符串分别是什么代表什么。
语法分析: 根据词法分析的结果和语法规则,判断是否满足Mysql语法。
优化器:分析器知道要做什么,优化器在便利有多个索引时,决定使用哪个索引;在一个语句有多表关联(join)时,决定
各个表的连接顺序。(TODO关于具体的选择方式后续补充)
执行器:优化器知道怎么做了,执行器进行执行语句

引擎层:负责数据的存储和提取。架构模式是插件式的,支持InnoDB(默认)、MyISAM(不支持事务)、Memory(针对具体表,而非数据库)
InnoDB、MyISAM、Memory比较:
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(银行),
要求实现并发控制(售票),选择InnoDB。如果需要频繁更新、删除操作的数据库也选择InnoDB。因为支持
事务的提交和回滚
MyISAM:插入数据块、空间和内存使用比较低。如果表主要用于插入新记录和读出记录,选择MyISAM能实现处理高效率。
如果应用的完整性、并发性要求比较低,也可使用。
Memory:所有数据存在内存中,数据处理速度快,但不安全。如果需要很快的读写速度,对数据的安全性要求低,可选择Memory
它对表的大小有要求,不能建立太大的表。
客户端连接server时,长连接和短链接;
长连接:连接成功后,如果客户端持续有请求,则一直使用同一个连接
短链接:每次执行完很少的几次查询就断开连接,下次查询再重新建立一个
由于建立连接的过程比较复杂,建议尽量减少连接的动作,也就是尽量使用长连接
但如果使用长连接后,会发现Mysql内存涨的很快。因为Mysql在执行过程中临时使用的内存是管理再连接对象里的。这些资源只有在连接断开
的时候才会释放,如果长连接累计下来,可能会导致内存占用太大,被系统强行杀掉(OOM),从现象上看就是Mysql异常重启。
解决方案:
1、定期断开长连接 : 使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,端来连接,之后要查询再重连
2、调用mysql内部函数:如果使用的是Mysql5.7或者更新版本,可以在每次执行一个比较大的操作后,通过执行mysql_reset_connection(mysql内部function)
来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

更新sql语句的执行过程:

首先初始化数据:

mysql> create table T(ID int primary key, c int);
mysql> update T set c=c+1 where ID=2;

分析innoDB引擎执行流程:
1、执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
2、执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据。
3、引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
4、执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
5、执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log 改成提交(commit)状态,更新完成。
在这里插入图片描述
redolog和binlog的区别:
1、redolog 是InnoDB存储引擎特有的;binlog是server带有的,所有的引擎都支持。
2、redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
3、redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值