作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下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讲》

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

MySQL核心知识学习之路(1)的更多相关文章

  1. 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享

    近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...

  2. MySQL索引知识学习笔记

    目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...

  3. MYSQL+PHP的学习之路

    MYSQL+PHP 先从MYSQL开始吧 第一步:SQL语句基础 1.书籍 2.网站: 这个网站在线测试和考试http://sqlzoo.net/wiki/SELECT_basics/zh 3.学习过 ...

  4. mysql 核心知识要点

    整体知识介绍:mysql基本操作和使用,mysql优化(索引,分表等),mysql部署(读写分离,负载均衡等) 数据库基本介绍:数据库概念,常用数据库,web应用三大软件分工,PHP动态语言特点(处理 ...

  5. MySQL核心知识

    MySQL常用的命令 启动:net start mySql; 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; 列出数据库 ...

  6. Webwork 学习之路【03】核心类 ServletDispatcher 的初始化

    1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...

  7. MySQL学习之路(一)——初涉MySQL。

    MySQL学习之路(一) 1.1MySQL的概述 MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版和企业版. 1 ...

  8. Docker 与 K8S学习笔记(二)—— 容器核心知识梳理

    本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...

  9. 阿里封神谈hadoop学习之路

    阿里封神谈hadoop学习之路   封神 2016-04-14 16:03:51 浏览3283 评论3 发表于: 阿里云E-MapReduce >> 开源大数据周刊 hadoop 学生 s ...

  10. 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)

    七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...

随机推荐

  1. 【C语言】解决初始化数组时报错“undefined reference to `memcpy'”

    [C语言]解决初始化数组时报错"undefined reference to `memcpy'" 零.报错 代码: char start[] = {0xd, 0xa, 0xb3, ...

  2. study Rust-3【表达式和函数】

    1. Rust与优美的pascal很相似.但是这个表达式概念很有意思.见上图.[1.条件赋值语句:2.表达式返回值] 2.注意变量和隐藏变量的概念,这个也有创意. 3.函数在Rust无处不在.

  3. docker概述及镜像管理

    dockers概述 docker官方网站 docker官网:https://www.docker.com/ docker镜像仓库:https://hub.docker.com/ 什么是docker? ...

  4. python之“if __name__=="__main__"”的代表的意思和用法

    创建下方脚本A def print_sum(a): print(a) print_sum(20) if __name__=="__main__": print("test ...

  5. kettle介绍-Step之If field value is null

    If field value is null介绍 替换NULL值步骤可以将输入流中所有字段的空值进行替换,也可以指定一种类型下的空值进行替换,还可以指定一个字段下的空值进行替换 三种替换NULL模式 ...

  6. Yuque Rich Text(语雀富文本编辑器)

    Yuque Rich Text(语雀富文本编辑器) 由于本人觉得语雀编辑器非常好用,很符合我的使用习惯,然后发现语雀的Chrome浏览器插件实现了编辑器的功能,所以将其富文本的功能拆分位一个单独的Vu ...

  7. K8s新手系列之K8s中的资源

    K8s中资源的概念 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes. kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓 ...

  8. VC6.0工具下载安装

    公众号回复:'VC6.0'

  9. Graphpad Prism10.1.2 中文版科学绘图软件 安装包下载

    Prism10中文版下载链接: https://pan.baidu.com/s/18a0_uLi3ANWC3KxlHOzZAA?pwd=6666 提取码: 6666 Graphpad Prism 是一 ...

  10. mssql sqlserver 使用xp_cmdShell运行时,报15281异常的处理办法

    下文讲述 使用xp_cmdshell运行时,出现消息异常的操作方法,如下所示:实验环境:sql server 2008 R2 今天在sql查询管理器中运行xp_cmdshell命令时,出现以下错误现象 ...