MySQL核心知识学习之路(1)
作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第一篇,总结了MySQL的基础架构、一个查询语句的执行过程 以及 一条更新语句的执行过程。
1 MySQL的基础架构
为了窥其全貌,我们首先需要了解一下MySQL的基础架构,如下图所示:

图片来自林晓斌《MySQL实战45讲》
可以从图中看到,MySQL分为了Server层和存储引擎层,Server层包括了连接器(用于管理连接和权限验证)、查询缓存(用于缓存查询结果)、分析器(词法分析和语法分析)、优化器(执行计划生成及索引选择)以及执行器(操作存储引擎接口,返回最终结果),而存储引擎层则负责数据的存储和提取。存储引擎层是插件式架构,目前MySQL默认存储引擎是InnoDB。当然,你也可以切换为MyISAM或Memory。
2 一个查询语句的执行过程
现在我们来看一个查询语句的执行过程,会涉及到刚刚提到的基础架构中的所有组件。查询语句如下:
select * from T where ID=10;
(1)连接器
首先,我们需要通过以下语句连接到这个数据库上,这时候我们使用的就是连接器这个组件来创建和MySQL的连接。
mysql -h$ip -P$port -u$user -p
建立连接的过程通常是比较复杂的,建议尽量使用长连接!
长连接累计过多也可能会导致内存占用问题,解决方案有以下两种:
定期断开长连接
通过执行mysql_reset_connection来重新初始化连接资源(MySQL 5.7+)
(2)查询缓存
查询缓存顾名思义就是对查询结果的缓存,它会直接存放在内存中。但是,查询缓存的失效非常频繁,弊大于利。因此,它只适用于静态配置表之类的场景,而MySQL新版本(8.0)直接将其废弃了。
建议对于查询缓存按需使用,设置参数:query_cache_type=DEMAND。对于确定使用缓存的时候,可以直接通过以下语句查询:
select SQL_CACHE * from T where ID=10;
(3)分析器
对于不走缓存的命令,就要开始执行词法分析和语法分析了。
词法分析,就是从这一行语句中识别出:select是查询关键词、字符串T是表名T,字符串ID是列ID,以此类推。
语法分析,就是根据语法规则判断语句是否满足MySQL语法,如果语句不对,则会抛出“You have an error in your SQL syntax”的错误提示。
(4)优化器
正式执行之前,优化器会对你的语句进行一些优化,比如:
在表中含有多个索引的时候,决定使用哪个索引。
在一个语句中有多表关联(join)的时候,决定各个表的连接顺序。
(5)执行器
前期准备工作就绪之后,正式开始执行。
首先,判断用户是否对此表具有执行查询的权限。
其次,根据表的引擎定义,使用这个引擎提供的接口。
对于这个语句而言,具体步骤如下:
调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,是则将这行存在结果集中。
调用引擎接口取“下一行”,重复相同的逻辑判断。
将满足条件的记录集作为结果集返回给客户端。
到此,这个语句就执行完成了。
最终,我们可以通过下图所示的流程来回顾一下这个查询语句的执行过程全貌。

综述,对于一个查询语句的执行过程有了初步了解,实际就是对MySQL逻辑架构有了一个初步印象。
3 一个更新语句的执行过程
现在我们来看看如下所示的一条更新语句的执行过程:
update T set c=c+1 where ID=2;
事实上,更新语句和查询语句所经历的流程一模一样,不同的地方在于更新语句在执行器阶段还会涉及到两个日志模块:redo log(重做日志)和 binlog(归档日志)。
redo log
redo log即重做日志,它是InnoDB引擎特有的日志。
当有一条记录需要更新时,InnoDB引擎会将其记录(记录内容:在某个数据页上做了什么修改)写到redo log中,并更新内存。然后,InnoDB引擎会在适当的时候将这个操作记录更新到磁盘里面。
redolog是循环写入的方式,空间固定会用完,因此当空间满了的话,需要提前擦除一些数据腾空间。
有了redolog,InnoDB引擎才可以说具有了crash-safe的能力。
binlog
binlog即归档日志,它是MySQL Server层实现的,所有引擎(包括InnoDB)均可使用。
binlog属于逻辑日志,记录的内容类似于“给 ID=2 这一行的 c 字段加 1”这种。与redolog不同,binlog是通过“追加写”的形式记录的。
binlog在MySQL主从备份的场景中使用较多,如果我们需要从数据库同步主数据库的内容,我们就可以通过binlog来进行同步。而阿里的开源项目Canal则是一个针对binlog消费的经典案例:

那么,问题来了:为什么有两套日志?
因为早期MySQL的默认引擎是MyISAM,那时还没有InnoDB,而binlog只能用于归档,因此不具备crash-safe的能力。因此,后来InnoDB自己通过redo log实现了crash-safe能力。
两阶段提交
对开头提到的这个更新语句的执行过程如下图所示:

图片来自林晓斌《MySQL实战45讲》
我们可以看到,引擎会将新数据先更新到内存中,同时将其操作记录到redo log中,这时redo log处于prepare状态。
然后,告知执行器执行完成,时刻准备着提交事务。
执行器收到通知,开始生成这个更新操作的binlog,并将其写入磁盘。
最后,执行器调用引擎提供的提交事务的接口,这时引擎会将写入的redo log改成commit状态,代表更新操作正式结束。
这就是MySQL的两阶段提交,prepare和commit两个状态。
那么,问题来了:为什么要两阶段提交?
因为redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。两阶段提交也是跨系统维持数据逻辑一致性的一个常见方案。
4 小结
本文总结了MySQL的基础架构、一条查询语句和一条更新语句的执行过程,通过高屋建瓴的视角俯视了MySQL最常见的应用场景,可以帮助我们有一个初步的了解。
参考资料
林晓斌(丁奇),《MySQL实战45讲》
扫码订阅《MySQL实战45讲》


MySQL核心知识学习之路(1)的更多相关文章
- 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享
近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...
- MySQL索引知识学习笔记
目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...
- MYSQL+PHP的学习之路
MYSQL+PHP 先从MYSQL开始吧 第一步:SQL语句基础 1.书籍 2.网站: 这个网站在线测试和考试http://sqlzoo.net/wiki/SELECT_basics/zh 3.学习过 ...
- mysql 核心知识要点
整体知识介绍:mysql基本操作和使用,mysql优化(索引,分表等),mysql部署(读写分离,负载均衡等) 数据库基本介绍:数据库概念,常用数据库,web应用三大软件分工,PHP动态语言特点(处理 ...
- MySQL核心知识
MySQL常用的命令 启动:net start mySql; 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; 列出数据库 ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- MySQL学习之路(一)——初涉MySQL。
MySQL学习之路(一) 1.1MySQL的概述 MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版和企业版. 1 ...
- Docker 与 K8S学习笔记(二)—— 容器核心知识梳理
本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...
- 阿里封神谈hadoop学习之路
阿里封神谈hadoop学习之路 封神 2016-04-14 16:03:51 浏览3283 评论3 发表于: 阿里云E-MapReduce >> 开源大数据周刊 hadoop 学生 s ...
- 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)
七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...
随机推荐
- Lua程序设计笔记
未学:第10章URL编码及以后的示例 13章位和字节 Lua语言基础 一组命令或表达式组成的序列叫chunk程序段,因为Lua语言可以被用作数据定义语言,chunk的大小没有限制,几MB的程序段也很常 ...
- 生命游戏Delphi实现
生命游戏,康威生命游戏(Game of Life),剑桥大学约翰·何顿·康威设计的计算机程序. 生命游戏没有游戏玩家各方之间的竞争,也谈不上输赢,可以把它归类为仿真游戏.事实上,也是因为它模拟和显示的 ...
- P3392 涂国旗 题解
题目大意 题目真的是不说人话...... 有一个国家的国旗是由一个 N * M 的方格组成的.如果想要这面国旗合法,就必须满足要求: 国旗从上到下必须是白色.蓝色和红色,顺序不能改变. 每一种颜色都至 ...
- Echarts服务端渲染以及客户端懒加载实现方案
为了提升首屏的加载速度,考虑先用服务端渲染快速输出首屏图表,然后等待 echarts.js 加载完后,通过注水操作(Hydration),重新在客户端渲染同样的图表 tips:在客户端渲染的时候,应开 ...
- day11”函数“入门
函数 函数的作⽤ 函数的使⽤步骤 函数的参数作⽤ 函数的返回值作⽤ 函数的说明⽂档 函数嵌套 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利 ...
- Mybatis的*Dao.XML中的配置与其对应的接口、resultMap的运用
例子. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC &quo ...
- ipconfig出现媒体状态为媒体已断开连接问题
1.可能是因为路由器或者是交换机没有DHCP功能,需要手动的给电脑配置IP和掩码
- 北京市第六届信息通信行业网络安全技能大赛(初赛)-CTF夺旗阶段 EZRSA writeup
题目EZRSA EZRSA.py from Crypto.Util.number import * import gmpy2 from flag import m p = getPrime(1024) ...
- 一、C语言概述
声明 本文内容大多取自<高级语言程序设计一书>,为本人学习笔记记录,切勿用于商业用途. 第一节 计算机发展 电子计算机已经历的四个发展时代: 第一代:20 世纪 50 年代,主要采用真空电 ...
- 从零开始搭建React+vite企业级项目框架
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...