一、从查询语句的执行过程来看MySQL架构

从一条语句的执行过程来窥探MySQL的架构,MySQL从架构上可以分为Server层和存储层。Server层有连接器、查询缓存、分析器、优化器和执行器。存储层是以插件形式存在的,在建表的时候选择存储引擎,默认是innoDB。
连接器:SQL语句的执行需要先获取连接,指定ip+port+user+password,然后MySQL通过检验之后就获得一条连接,后面查询的内存管理都在这个连接上。连接分为长连接和短连接,长连接是指客户端如果持续有请求,那么继续复用相同的连接。而短连接是指执行几次查询之后就断开连接,下次重新连接。由于连接是比较复杂的过程,建议使用长连接,但是长连接会带来内存暴涨的问题,可能会被kill掉,现象就是MySQL突然断开。这种情况下可以定时断开长连接,获取执行完比较消耗内存的查询之后,主动断开连接或者reset连接。
查询缓存;MySQL的查询缓存是比较鸡肋的,因为当表更新之后,该表的查询缓存会失效。因此很少能命中查询缓存。除非是更新少,读取多的配置表。MySQL8.0以后已经废弃了查询缓存
分析器:分析器进行词法分析和语法分析。词法分析解析SQL语句,生成一个个单词,判断输入的单词是否正确,比如说select 、from等词是否输入正确,不符合的话会报错。然后生成的单词进一步生成语法树,判断整个语句是否符合MySQL的语法,不符合的话也会报错。
优化器:这个阶段是分析SQL语句如何执行更优。包括使用哪个索引,join的顺序等
执行器:执行器首先判断用户是否有该表的权限,如果有的话就去存储引擎取数据,判断是否符合,符合的话放入结果集,然后继续去存储引擎取下一行,重复上述过程,一直到取到最后一行,最后再把结果集返回给客户端。那么这条语句就到此完成了。
二、从SQL更新过程理解redo log和binlog
SQL语句的更新过程总体上和查询过程一致,都是先建立连接,分析器进行语法、语法分析,优化器选择索引,执行器调用引擎层的接口更新语句。具体不同的地方如下:

redo log是引擎层的日志,用于MySQL的case-safe,数据在写入时,不会直接写入磁盘(性能太差),而是先写到redo log,然后不同的机制会再刷入磁盘。如果MySQL突然崩溃,可以从redo log进行恢复,redo log记录的是具体在哪个数据页更新了什么内容。采用循环写机制,有一个check-point将redo log刷新到磁盘,write pos是写入指针,两个指针相遇的时候就需要check point将redo log刷新到磁盘,才能继续写入

执行器调用引擎层获取ID=2那一行,引擎层先看内存buffer pool有没有,有的话直接返回,否则要去磁盘获取加载到内存中。然后执行器更新ID=3,调用引擎层写入,引擎层先将新行写入内存,然后写入redo log此时这个事务处于prepare状态,然后执行器写入binlog,再调用引擎层将事务提交,对应的redo log commit。这样就能保证崩溃的时候无论处于哪一个状态,要么事务回滚或者提交成功,binlog和redo log能保持一致,进而保证后续恢复临时库或者扩容的时候,能保值主从一致性
三、事务的隔离性
事务有四大特性:原子性、隔离性、持久性和一致性。隔离性是指事物之间的隔离程度。MySQL的隔离性有读未提交、读提交、可重复读和串行化。
串行化:读加读锁,写加写锁,遇到锁冲突就等待
那么事务的隔离性是如何实现的呢?
对读未提交来说,只需要返回最新值即可;对于串行化是利用加锁来进行隔离;对于读提交和可重复读来说是通过read view来实现的。读提交会在每个SQL语句执行的时候生成一个视图,而重复读则是事务启动的时候。以可重复读为例:

如图,一条记录从1,2,3最后变为4,在每个事务中产生了不同的视图,通过回滚日志,(从当前值如果回滚到之前版本的日志)来得到不同版本,同样的一条记录存在多个不同版本,这就是数据库的MVCC机制。MySQL就是通过不同的视图实现了事务的隔离性,然后在当没有比当前回滚日志更早的视图之后,日志才能被回收。比如说如果A视图还存在,那么将3改为2这个回滚日志就不能被回收。所以尽量不要使用长事务,因为事务用到的回滚段难以回收,占有较大的存储空间。
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
我有一个任务列表(名称、starts_at),我试图在每日View中显示它们(就像iCal)。deftodays_tasks(day)Task.find(:all,:conditions=>["starts_atbetween?and?",day.beginning,day.ending]end我不知道如何将Time.now(例如“2009-04-1210:00:00”)动态转换为一天的开始(和结束),以便进行比较。 最佳答案 deftodays_tasks(now=Time.now)Task.find(:all,:conditio
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG