MySQL 核心模块揭秘 |《发刊词》

1. 为什么要写专栏?

我还在做业务系统研发的时候,有一段时间,系统不稳定,慢 SQL 很多。我们团队花了很长时间持续优化 SQL。

我们有一个表格,从慢查询日志里整理出了很多慢 SQL。其中一些 SQL,按照我们的理解,根本不应该出现在表格里,但是它们却经常出现。

我对这些 SQL 印象深刻,它们是:

  • update xxx set xxx where id = xxx
  • commit
  • truncate table xxx

以我们当时对 MySQL 有限的了解,这些 SQL 执行起来都很快,不应该出现在慢查询日志里。

我们不了解这些 SQL 执行过程中都干了些什么,不理解它们是怎么执行的,想要优化也就无处下手了。

随着逐渐深入研究 MySQL 源码,我已经能解释这些 SQL 为什么会出现在慢查询日志里了。

对 SQL 执行过程不了解,这是我曾经的痛点,相信也是很多业务系统研发和 DBA 的痛点。

我投入了很多时间研究 MySQL 源码,正在逐步解决这些痛点。

现在,我把这些内容写出来,分享给需要的各位读者,希望也能帮助大家解决工作过程中遇到的痛点。

2. 专栏包含哪些内容?

我正在研究 InnoDB 的几个模块,专栏内容都来源于这些模块:

  • 事务
  • 锁(InnoDB 的记录锁和表锁,不包含 server 层的元数据锁)
  • Redo
  • Undo
  • MVCC

3. 专栏内容怎么呈现?

关于专栏的内容,我考虑过 3 种呈现方式。

① 源码详细分析
以讲解源码为主,在讲解源码的过程中,顺便介绍原理。

之前写过几篇 MySQL 功能实现的源码分析文章、也结合源码写了几篇分析线上问题的文章,有读者反馈看不懂源码,对于这样的文章,他们会直接跳过源码,只看原理介绍。

② 源码关键节点 + 原理介绍:
用 SQL 执行过程中经历的关键节点的源码把原理串起来。

这种方式按照 SQL 的执行流程,通过源码关键节点来介绍原理,文章内容可能会有点碎片化,不好抽象成介绍原理且逻辑流畅的文章。

③ 原理介绍:
这种方式以讲解原理为主,在需要的时候会加上一点点源码作为辅助,方便理解。我之前写的公众号文章主要以这种方式呈现。

考虑到目标读者是想了解 MySQL 底层原理的业务系统研发和 DBA,最终还是确定以第 ③ 种方式(原理介绍)来写专栏的系列文章。

4. 聊聊心路历程

这个专栏从虚无中诞生,算是个结果。凡事有果必有因,我们再来聊聊是什么因结出了这个果。

细算起来,我已经 4 个月没写文章了,停更这么久,并不是放弃了写文章,而是把重点转移到研究 MySQL 源码上了。

这段暂停时期,既是意料之外,也是顺理成章。

意料之外在于,我也没有想到 8 月份写完《InnoDB 全表扫描和全主键扫描一样吗?》这篇文章之后,就会停更,并且一停就是 4 个月。

顺理成章在于,8 月份之前已经有一段时间感觉到写文章吃力了,停更也是迟早的事。

我思考过感到吃力的原因:
因为我的目标是每周发一篇文章,一周之内我需要找到一个文章主题、并且研究这个主题相关的代码、写成文章。

其中最费时间的就是研究代码了,这通常会占据我一周中大部分用于写文章的业余时间。

研究代码占用了大量时间,再加上写文章,这让我感到越来越吃力。

到 8 月份写完前面提到的那篇文章之后,有一些复杂的感觉交织在一起:如释重负、元气耗尽、迷茫,让我没有动力继续写下一篇文章了。

这些复杂的感觉交织的过程中,我也在思考接下来要怎么办?写文章这件事怎么才能做到更轻松更持久?

为此,我先总结了一下我写文章的几个阶段。

第 1 阶段:
刚开始研究 MySQL 源码的时候,我也会写文章,发到我的博客上。

写完文章之后还会给同事看,同事说看不懂。

当时我也很郁闷,我很用心的花了很长时间写的文章,同事看不懂。

虽然郁闷,但日子还要继续过下去,还得继续研究源码、继续写文章。

第 2 阶段:
就这样一边郁闷,一边研究代码,一边写文章,时间就过去了几个月。

某一天,我又写了一篇文章,发给同事看。同事看了之后,给出了很不错的评价。

这让理解了从读者的角度来看,什么样的文章算是好文章。

接下来的事就顺理成章了:注册公众号、继续研究源码、继续写文章。

这里要郑重感谢一下我前面提到同事 @李亮,在前期给了我很重要的帮助。

第 3 阶段:
全职研究代码,基本上一周发一篇文章。

这个阶段虽然没有收入,但是每天动力很足,有一种感觉就是日子过的红红火火。

这叫什么?这就叫穷开心!

第 4 阶段:
我上班了,只能利用业余时间研究代码。

想要像之前那样写长文章,还每周发一篇,已经不太可能实现了。

这个阶段的主旋律就是围绕问题研究代码、写文章,同事和读者有时候会问我一些问题,我就围绕问题去研究代码,写成文章。

开始一段时间,依然乐此不疲。虽然吃力,也还基本能应付过来。

时间一长,吃力感越来越明显了,持续到 8 月份,写文章之事就由于不堪重负暂时停了下来。

我还想继续写文章,但需要找到一种相对来说更轻松的方式,这样才能可持续发展。

经过一番思考之后,我决定把写文章的事放一放,先专心研究一段时间代码,把 InnoDB 几个主要模块的细节都研究一遍,再接着写文章。

时间飞快,转眼已是四个月,从秋高气爽到白雪皑皑,我恢复了元气,又可以继续写文章了。

重生的文章,以系列的形式连载,需要新的载体,于是就有了这个专栏。

接下来,就要进入第 5 阶段了。这个专栏和第 5 阶段相伴而生,我在此许下一个愿望:希望专栏和第 5 阶段都能够持续的很久很久,和大家一起奔赴未来!

5. 我们一起奔赴未来!

《MySQL 核心模块揭秘》 专栏预期每周发布一篇文章,持续一年左右。

接下来的一年,我们一起 探索 InnoDB 事务、锁、Redo、Undo、MVCC 的底层原理,看看 MySQL 运行时都干了什么?

风起于青萍之末,浪成于微澜之间。下一期(专栏的第 1 篇正式文章)我们会聊聊 InnoDB 事务的起源:事务池和事务池管理器

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细讲解Java使用EasyExcel函数来操作Excel表(附实战)

目录 前言1. EasyExcel类2. 原理分析3. demo4. 实战 前言 前阵时间好奇下载Excel,特意学习实战了该功能:详细讲解Java使用HSSFWorkbook函数导出Excel表(附实战) 现在发觉还有个EasyExcel也可专门用来读写Excel表 1. EasyExcel类…

uni-app uni.scss内置全局样式变量

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

python3 函数

Python 定义函数使用 def 关键字,一般格式如下: def 函数名(参数列表):函数体 让我们使用函数来输出"Hello World!": >>> def hello() :print("Hello World!") &…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第三节 栈与堆,值类型与引用类型 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工…

【项目】玩具租赁博客测试报告

目录 一、项目背景 二、项目功能 三、功能测试 一、项目背景 玩具租赁系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有十五个页面构成:用户注册、管理员注册、登录页、用户和管理…

Qt 中使用 MySQL 数据库保姆级教程(下)

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 上篇中我们安装好了 MySQL 数据库和 Navicat 软件,下面在 Qt 中尝试使用数据库 1. 在 Qt 中连接 MySQL 数据库&#…

NAS上使用Docker搭建Wiki.js构建云知识库

文章目录 NAS上使用Docker搭建Wiki.js、PostgreSQL和Nginx云知识库前置条件步骤1:获取wikijs的镜像步骤2:配置容器参数2.1 端口设置2.2 挂载设置2.3 环境变量设置(配置数据库) 步骤3. 启动界面3.1 切换语言3.2 GIT 配置3.3 用户和…

【K8S 二进制部署】部署Kurbernetes的网络组件、高可用集群、相关工具

目录 一、K8S的网络类型: 1、K8S中的通信模式: 1.1、、pod内部之间容器与容器之间的通信 1.2、同一个node节点之内,不同pod之间的通信方式: 1.3、不同node节点上的pod之间是如何通信的呢? 2、网络插件一&#xff…

jQuery: 整理5---删除元素和遍历元素

1. 删除元素 span{color: white;padding: 8px;margin: 5px;float: left;}.green {background-color: green;}.blue {background-color: blue;}<span class"green">green</span><span class"blue">blue</span><span class"…

门控循环单元(GRU)-多输入回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、全部代码数据分享&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译…

Apache Jackrabbit漏洞浅析

Apache Jackrabbit是一个Java开源内容存储库&#xff0c;1.0.0 < 版本 < 2.20.11、2.21.0 < 版本 < 2.21.18存在RMI功能导致的远程代码执行漏洞。 补丁分析 对比补丁前后两个版本&#xff08;https://github.com/apache/jackrabbit/compare/jackrabbit-2.20.10..…

计算机图形学理论(5):光能传递

局部照明与全局照明 局部照明 只考虑从物体表面到眼睛的直射光。 全局照明 全局照明考虑了直接照明和间接照明&#xff08;根据应用配置可以有多次反射&#xff09;。 全局照明技术 光能传递 光能传递是一种模拟从光源开始的光漫反射传播的方法。这种方法的基础来自于“…

Python-动态柱状图可视化

柱状图 1.基础柱状图1.1通过Bar构建基础柱状图1.2反转x轴&#xff0c;y轴1.3数值标签在右侧1.4总结 2.基础时间柱状图2.1掌握基础的时间线配置动态图表2.2创建时间线2.3自动播放2.4时间线设置主题2.5总结 3.GDP动态柱状图绘制3.1掌握列表的sort方法并配合配合lambda匿名函数完成…

【数据库系统概论】第5章-数据库完整性

文章目录 引言5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名子句5.6 触发器 引言 数据库的完整性是指数据的正确性和相容性。 正确性&#xff1a;符合现实语义、反映当前实际情况。性别必须为男或女。 相容性&#xff1a;数据库同一对象在不同关系表中…

115基于matlab的用于铣削动力学建模的稳定性叶瓣图分析(stablity lobe)

基于matlab的用于铣削动力学建模的稳定性叶瓣图分析(stablity lobe)&#xff0c;程序已调通&#xff0c;可直接运行。 115matlab铣削动力学 (xiaohongshu.com)

生活常识-如何开社保证明(四川)

下载并打开天府市民云APP 注册后登陆 点击社保服务 点击社保证明 点击【四川省社会保险个人社保证明名(近24个月)】 点击下载 下载后点击【QQ发送给好友&#xff0c;然后发送给自己的电脑设备(我的电脑)】

数据类型-变量-内存四区-指针

1、内存四区 1.1、数据类型的本质 1&#xff09;数据类型基本概念 类型是对数据的抽象类型相同的数据具有相同的表示形式、存储格式、相关的操作程序中使用的数据必定属于某种数据类型数据类型和内存 有关系C/C 引入数据类型&#xff0c;可以更方便地管理数据 2&#xff09…

laravel5.8中实现验证码组件的安装和验证

本篇文章主要讲解使用laravel5.8自带的验证码库实现验证码验证的效果教程。通过本教程你可以快速接入到自己的项目中开发相应的验证功能。 作者&#xff1a;任聪聪 (rccblogs.com) 日期&#xff1a;2023年12月17日 实际效果 安装步骤 步骤一、输入命令 composer require mews…

代理模式:中间者的故事

代理模式&#xff1a;中间者的故事 介绍需求分析代理模式代码实现代理模式整理和用途第一种用途第二种用途第三种用途第四种用途 总结 介绍 本文引用《大话设计模式》第七章节的内容进行学习分析&#xff0c;仅供学习使用 需求&#xff1a;小明拜托自己好朋友小王给他朋友小美…

Swift函数式编程——函数

目录 Swift函数式编程&#xff0d;函数 高阶函数&#xff08;Higher order function&#xff09; 一等函数&#xff08;First class function&#xff09; 闭包 函数柯里化&#xff08;Function Curring&#xff09; 函数式思维 使用函数解决问题 使用函数组合 总结 Sw…