MySQL大致可以分为Server层和存储引擎层

Server层包括连接器,查询缓存,解析器,预处理器,优化器,执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程,触发器和视图等

连接器

负责跟客户端建立连接,获取权限,维持和管理连接

用户名密码验证通过后,连接器会到权限表中查询用户的权限,之后这个链接里面的权限判断逻辑,都依赖于此时读取的权限;即使使用管理员账号对用户权限作修改,也不会影响已存在的连接的权限

参数wait_timeout控制服务器保持与客户端的空闲连接的时长,默认值为8小时

长连接积累导致MySQL占用内存飞涨

考虑定期断开长连接

MySQL5.7以后,执行mysql_reset_connection来重新初始化连接资源 (此过程不需要重连和重现验证权限,但是会将连接恢复到刚创建完成的状态)

MySQL :: MySQL 5.7 Reference Manual :: 27.8.7.60 mysql_reset_connection() dev.mysql.com/doc/refman/…

查询缓存

如果查询恰好命中查询缓存,那么查询不会被解析,执行计划不会被生成,在返回查询结果之前,MySQL会检查用户的权限

对一张表的更新,会导致这张表的查询缓存被清空(查询缓存失效频繁,弊大于利)

推荐按需使用查询缓存

设置参数query_cache_type设置成DEMAND,默认情况下,SQL不使用查询缓存,通过SQL_CACHE显示指定使用查询缓存

select SQL_CACHE * from T where ID = 10;

MySQL 8.0已经将查询缓存整块功能删除掉

解析器(做什么)

词法分析,识别SQL中的字符串是什么

语法分析

在词法分析的基础上,根据语法规则,判断SQL是否满足MySQL语法,最后得到一棵语法树

对于只是参数不同,其他均相同的sql,它们执行时间不同但硬解析的时间是相同的;而同一SQL随着查询数据的变化,多次查询执行时间可能不同,但硬解析的时间是不变的

词法分析 -> 语法分析可以称为硬解析

预处理器

根据MySQL规则,进一步检查语法树是否合法

比如检查表、数据列是否存在;别名是否有歧义等等

优化器(怎么做)

优化器会将语法树转化成执行计划(可以生成多个执行计划),然后找出最合适的执行计划(成本最少)

可以通过Last_query_cost得知查询的成本

” alt=”优化器认为,这条SQL大概需要做1.399个数据页的随机查找才能完成查询” data-src=”https://user-gold-cdn.xitu.io/2019/5/18/16ac9fad386a635e?imageView2/0/w/1280/h/960/format/webp/ignore-error/1″ data-width=”1187″ data-height=”415″ />

上图表示,优化器认为,这条SQL大概需要做1.399个数据页的随机查找才能完成查询

可以请求优化器解析优化过程的各个因素(explain sql)

在表里面有多个索引的时候,决定使用那个索引

通过特殊的关键字提示优化器,可以影响优化器的决策过程(例如:for index)

优化器阶段完成后,执行计划就确定下来了

优化器有时候会选择错误的执行计划

索引统计信息不准

优化器理解的最优执行计划不一定是响应最快的执行计划

存储引擎层

负责数据的存储和提取,插件式的架构模式,支持InnoDB,MyISAM等多个存储引擎

不同的存储引擎共用同一个Server层

redo log

InnoDB引擎独有的日志,存储引擎层日志

当有一条记录需要更新的时候,InnoDB引擎会更新内存,并把记录写到redo log里面,然后在适当的时候,将这个操作记录更新到磁盘

redo log的大小是固定的

write pos是当前记录的位置,一边写一边后移,写到末尾又从头开始

check point是当前要擦除的位置,同样也是往后移动并且循环,擦除记录,先把日志更新到磁盘中

有了redo log,innodb可以保证,数据库发生异常重启,之前提交的记录都不会丢失(崩溃恢复能力,crash-safe)

bin log

Server层的日志,只能用于归档,,没有carsh-safe能力

之后再介绍更加详细的信息

redo log跟bin log的区别

redo log是InnoDB特有的;binlog是Server层实现的,所有存储引擎都可以使用

redo log是物理日志,记录“某个数据页上的修改”;binlog是逻辑日志,记录语句的原始逻辑

redo log是循环写的,空间固定;binlog是可以追加写入的,不会覆盖以前的日志

一条更新语句的执行流程

通过日志两阶段提交,可以保证redo log和bin log的逻辑一致

如果事务在①处奔溃了,事务会回滚

如果事务在②处奔溃了,由于redo log处于prepare阶段,并且binlog也已经写入,那么在恢复事务的时候,会自动commit

Write-Ahead Logging

使用日志,存储引擎可以在内存中更新数据,然后将更新持久化到磁盘的日志文件中,不需要每次都将更新后的数据刷新到磁盘(随机IO)

日志采用的是追加方式,写日志的操作实在磁盘上一小块区域的顺序IO(比随机IO快得多)

日志持久化到磁盘后,内存中被修改的数据(脏页)在后台可以慢慢刷新到磁盘

推荐参数设置

innodb_flush_log_at_trx_commit参数设置成1,表示每次事务的redo log都会持久化到磁盘

sync_binlog参数设置成1,表示每次事务的binlog都持久化到磁盘

mysql commit阶段,MySQL 基本架构与日志两阶段提交相关推荐

  1. mysql二级封锁协议_MySQL 行锁、两阶段锁协议、死锁以及死锁检测

    行锁 MySQL的行锁都是在引擎层实现的,但是 MyISAM 不支持行锁,意味着并发控制只能使用表锁,同一张表任何时刻只能被一个更新在执行,影响到业务并发度.InnoDB 是支持行锁的,这也是 MyI ...

  2. Mysql的两阶段锁协议

    问题引入 我们都知道事务的四大特性,ACID,原子性.一致性.隔离性.持久性.那么事务是如何实现这样的特性的呢?其中原子性通过redo.undo.binlog日志来实现:持久性通过mysql底层的刷磁 ...

  3. mysql之两阶段提交

    什么是两阶段提交 当有数据修改时,会先将修改redo log cache和binlog cache然后在刷入到磁盘形成redo log file,当redo log file全都刷入到磁盘时(prep ...

  4. 详解PostgreSQL数据库中的两阶段锁

    点击上方"蓝字" 关注我们,享更多干货! 数据库中的对象是共享的,假如不同的用户同时修改某个对象,就会出现数据错乱,从而破坏数据库的数据一致性,违反事务的隔离性原则. 为了满足隔离 ...

  5. 详解两阶段3D目标检测网络 Voxel R-CNN:Towards High Performance Voxel-based 3D Object Detection

    本文介绍一篇两阶段的3D目标检测网络:Voxel R-CNN,论文已收录于AAAI 2021. 这里重点是理解本文提出的 Voxel RoI pooling. 论文链接为:https://arxiv. ...

  6. 两阶段随机规划模型简介

    @[TOC]两阶段随机规划模型简介 两阶段随机规划模型简介 本文是作者学习两阶段随机规划的一个记录,对所用外文文献进行了一定的翻译.在涉及到不确定性的问题中,两阶段随机规划应用越来越广泛,在此对 两阶 ...

  7. 鲁棒优化(4):通过yalmip中的kkt命令实现CCG两阶段鲁棒优化

    两阶段鲁棒优化的原理推导部分,已经较多的文章进行分析.目前大部分同学面临的问题是,子问题模型中存在的双线性项该如何处理? 目前,主流方式是,采用对偶定理或KKT条件,将第二阶段的双层问题变成单层问题. ...

  8. 电网两阶段鲁棒优化调度模型(含matlab程序)

    目录 一 两阶段鲁棒优化理论 二 两阶段鲁棒优化程序实现 2.1 主/子问题变量要分清 2.2 对偶问题 2.3 线性化处理 2.4 编程小技巧 2.5 迭代问题 三 程序运行效果 视频讲解 两阶段鲁 ...

  9. 学习笔记 | Heckman两阶段法介绍

    最近看的两篇VC文献,都是有使用到Heckman两阶段法,所以就借此机会系统学习了Heckman两阶段法 本篇内容主要学习了如下文章: 1 CJAR的带你了解Heckman两步法 2 计量经济圈的He ...

最新文章

  1. iOS_根据文字字数动态确定Label宽高
  2. iTerm2 都不会用,还敢自称老司机?
  3. IT兄弟连 JavaWeb教程 jQuery中其他AJAX支持的函数
  4. Netbeans6.8使用手札(NetBeans6.8中Java、php、C/C++开发配置)
  5. The Excel Connection Manager is not supported in the 64-bit version of SSIS, as no OLE DB provider i
  6. solr4.10和solr5.x ik分词器配置,(Deprecated--2017-04-23)
  7. java记事本课程设计,java记事本课程设计
  8. gym103117J. Ants
  9. spring分布式事务示例_Spring声明式事务示例
  10. MongoDB数据库备份恢复与导入导出
  11. Redis从入门到精通:中级篇
  12. .NET编译工具(每日构建或自动化编译)
  13. windows bat命令启动python程序
  14. 2022年烟花爆竹经营单位安全管理人员培训试题及模拟考试
  15. codecademy 命令行手册(中英文)
  16. [渝粤教育] 广东-国家-开放大学 21秋期末考试土木工程施工10516k1
  17. Docker网桥模式ping不通宿主机
  18. rand函数和srand函数详解
  19. 第一单元:函数预备知识——邻域——01
  20. RAxML下载与使用与ML建树原理

热门文章

  1. zigzag convert
  2. 自然语言处理NLP文本分类顶会论文阅读笔记(二)
  3. IdentityServer4 获取Token及刷新Token
  4. 【Nmap的使用方法】
  5. linux2019排行网站,2019年Linux系统TOP100排行 国产Deepin排名第十
  6. pytorch怎么下载?pytorch在哪里下载?
  7. 读作工业4.0,唱作工业互联网,写作中国制造2025
  8. 三维重建 阈值分割 3D可视化 医学图像分割 CT图像分割及重建系统 可视化编程技术及应用
  9. YYModel的源码读后感
  10. AUTOCAD——螺旋