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,一经查实,立即删除!

相关文章

React面试题

1. 什么是 React? React 是一个用于构建用户界面的 JavaScript 库。它由 Facebook 开发并开源,广泛应用于现代 Web 应用程序的开发中。 2. React 中的组件是什么? 组件是 React 中构建用户界面的基本单位。它们是可重用且自包含的代码块&a…

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

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

flutter 使用高德地图

网址 引入高德地图组件 #地图插件amap_flutter_map: ^3.0.0# 定位插件amap_flutter_location: ^3.0.0 并执行命令 flutter pub get由于高德地图Flutter插件内不包含基础SDK包,所以需要单独引入地图基础SDK,在android文件加下的build.gradle文件中添加…

Spring Boot整合RocketMQ

pom.xml导入RocketMQ依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.2</version> </dependency>application.yml中添加配置 rocketmq:name-ser…

MySQL8 一键部署

#!/bin/bash ### 定义变量 mysql_download_urlhttps://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz mysql_package_namemysql-8.0.33-linux-glibc2.12-x86_64.tar.xz mysql_dec_namemysql-8.0.33-linux-glibc2.12-x86_64 mysql_download_…

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

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

python3 函数

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

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

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

EasyExcel 通过模板 导入、导出、下载模板

EasyExcel 通过模板 导入、导出、下载模板 import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import java.io.…

Linux 系统管理和监控命令---- auditctl 命令

auditctl 是 Linux 审计系统&#xff08;audit system&#xff09;的一部分&#xff0c;它允许管理员配置审计规则&#xff0c;以跟踪和记录系统活动。这些规则可以帮助你监控对特定文件的访问、追踪特定用户的活动或记录系统调用。以下是 auditctl 的一些常用用法及其示例&…

django调用矩阵分解推荐算法模型做推荐系统

在Django中调用推荐算法模型来构建推荐系统&#xff0c;通常需要几个步骤&#xff1a;训练模型、保存模型、在Django中加载模型以及使用模型进行推荐。以下是这个过程的一个简化示例&#xff1a; 步骤 1: 训练推荐算法模型 首先&#xff0c;你需要使用Python的机器学习库&…

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

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

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

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

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

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

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

目录 一、K8S的网络类型&#xff1a; 1、K8S中的通信模式&#xff1a; 1.1、、pod内部之间容器与容器之间的通信 1.2、同一个node节点之内&#xff0c;不同pod之间的通信方式&#xff1a; 1.3、不同node节点上的pod之间是如何通信的呢&#xff1f; 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平台编译…

【网络协议】WebSocket知识点梳理和总结

1. 前言 HTML5提出了全双工通讯协议WebSocket&#xff0c;让客户端和服务端交换数据更加便利。本篇梳理和总结一下WebSocket的方法和属性&#xff0c;并给一个示例代码。 2.WebSocket原型的方法和属性 Websocket继承于EventTarget&#xff0c;WebSocket原型对象的方法和属性如…

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;。 全局照明技术 光能传递 光能传递是一种模拟从光源开始的光漫反射传播的方法。这种方法的基础来自于“…