MySQL是怎样运行的:从根儿上理解MySQL

你会获得什么?

  • MySQL 的一些基本概念;
  • 如何处理使用 MySQL 过程中的乱码问题;
  • 从根儿上理解 InnoDB 存储引擎是如何存储记录、数据页,以及由页作为节点组成的B+树索引的原理;
  • 理解 InnoDB 存储引擎的表空间概念,知道 InnoDB 是如何管理段、区、页这些玩意儿以及 InnoDB 的数据字典;
  • 理解 MySQL 是如何执行单表查询、如何执行连接查询;
  • 理解 MySQL 基于代价的优化和基于规则的优化到底是啥意思;
  • 知道如何查看自己写的查询语句是好是坏,学会使用optimizer tracer;
  • 理解为什么需要事务以及它的基本概念;
  • redo 和 undo 日志的作用以及在 MySQL 中这些日志的细节;
  • 理解并发带来的各种问题以及 MySQL 中使用锁的各种细节;
  • 理解学习的快乐,希望各位看完本小册就像是读完一本小说一样畅快淋漓。

课程简介

MySQL凭借着它还不错的性能、还不错的稳定性常年稳居老二宝座,当然最大的优势就是它不要钱,还开源,这让它成为大部分中小型公司,尤其是互联网公司首选的数据库(近年来,越来越多的大公司也在尝试将业务转移到这种不要钱的数据库上来)。

越来越多的DBA和后端同学在工作中少不了和MySQL打交道,也经常会产生这样的疑问:

  • 为什么这个SQL执行的这么慢?
  • 为什么明明我建了索引但查询计划显示没用?
  • 为什么我的IN查询里的参数一多就不使用索引了?
  • 为什么突然我的数据就成了乱码?
  • 到底应不应该使用连接查询?
  • 吧啦吧啦一大堆……

在面试中MySQL的一些知识更成为躲不过的问题,比如索引结构、MVCC、隔离级别的实现、锁的使用等等都成为了面试考题重灾区。

其实对于工程技术人员来说,大部分接触的所谓技术是没那么需要智商的,只是需要讲解这些技术的同学稍微切换一个角度,切换到小白的角度而不是站在一个上帝视角去讲述问题,那些看起来非常高深复杂的问题其实都是为了一个非常简单的初衷而不得不采用的设计。我的任务就是带着大家从非常简单的问题出发,在解决问题的路上我们会遇到一些麻烦,由这些麻烦我们会很自然的引入一些新的概念,我会不断地向大家强化这些新概念,当我确保大家已经完全掌握了这些新概念后,会基于这些新概念再引入一些更为复杂的问题。高楼大厦虽然雄伟,解构之后不过是钢筋水泥。当然这个过程我会适当给大家加点儿料、扯扯犊子,让大家像读小说一样接受这些MySQL的核心概念。

小册的套路

我们相信,只要向大家有节奏地展示足够多的技术细节,那么整个学习过程将会变得流畅平滑,MySQL的面纱也会慢慢的被摘下。所以我们在后续介绍MySQL运行过程中需要用到的各种结构时会尽力向大家解释清楚每个字节都是干嘛用的,某几部分组合起来会有什么样的效果等等。

对于一些比较复杂的概念时,我不准备使用概念先行的方式进行讲解,也就是先给大家提出一个概念,然后介绍这个概念有什么什么属性,每个属性又有什么特点,每个特点又有什么用法。在解释比较复杂的问题时,我会按照下面的套路出发:

  • 我们遇到了什么问题
  • 为了解决问题提出了什么概念
  • 这个概念在MySQL中又有哪些需要注意的地方。

也就是:不先讲是什么,先讲为什么。

覆盖的内容

本小册致力于覆盖大家工作和面试过程中最常遇到的MySQL的一些核心概念,共划分为4个部分,各部分简介如下:

部分简介描述
第一部分入门以只会写增删改查语句的小白身份重新审视一下MySQL到底是个什么东东,会介绍MySQL的服务器程序和客户端程序有哪些,包括启动选项和系统变量以及字符集的一些事情。
第二部分基础结构相关唠叨记录、页面、索引、表空间的结构和用法,是全篇的基础,后边的章节都依赖于这些结构。
第三部分查询优化相关介绍同学们工作中经常遇到的查询优化问题,介绍单表查询是如何执行的,连接查询是怎么执行的,MySQL基于成本和规则的优化是个什么东西,以及会十分详细地介绍查看Explain语句执行结果的办法。
第四部分事务和锁相关介绍为什么会有事务的概念,以及MySQL是如何实现事务的,包括redo日志、undo日志、MVCC、各种锁的细节等~
全是图

有时候使用语言表述一个东西太抽象,一图胜千言,所以我们在各种可能让大家迷糊的地方画了各种对应的图示,整个小册用到的图片有上百张之多(其实我背地里画了 200 多张图片),象征性地贴几张:

  • Compact行格式示意图:
MySQL是怎样运行的:从根儿上理解MySQL
  • InnoDB数据页结构示意图:
MySQL是怎样运行的:从根儿上理解MySQL
  • B+树索引结构示意图:
MySQL是怎样运行的:从根儿上理解MySQL
  • 表空间结构示意图:
MySQL是怎样运行的:从根儿上理解MySQL
  • 单表查询中根据二级索引访问的示意图:
MySQL是怎样运行的:从根儿上理解MySQL
  • Buffer Poolfree链表示意图:
MySQL是怎样运行的:从根儿上理解MySQL
另外

当然,MySQL是一个很大的主题,我这里只能尽量用通俗的语言让大家理解许多重要的概念或者模型,要是事无巨细的都写出来应该能写好几千页,Baron Schwartz之前写了个关于InnoDB存储引擎的一个提纲:An Outline for a Book on InnoDB,他列了提纲之后貌似就再没写书的动静了,可能是内容太多了吧,这本书一直没见着问世,不过大家可以通过这个提纲一窥全貌。

课程目录

1 万里长征第一步(非常重要!非常重要!非常重要!此处省略一万遍) —— 如何愉快的阅读本小册
2 装作自己是个小白 —— 重新认识MySQL
3 MySQL的调控按钮 —— 启动选项和系统变量
4 乱码的前世今生 —— 字符集和比较规则
5 从一条记录说起—— InnoDB 记录结构
6 盛放记录的大盒子 —— InnoDB 数据页结构
7 快速查询的秘籍 —— B+ 树索引
8 好东西也得先学会怎么用 —— B+ 树索引的使用
9 数据的家 —— MySQL 的数据目录
10 存放页面的大池子 —— InnoDB 的表空间
11 条条大路通罗马 —— 单表访问方法
12 两个表的亲密接触 —— 连接的原理
13 谁最便宜就选谁 —— MySQL 基于成本的优化
14 兵马未动,粮草先行 —— InnoDB 统计数据是如何收集的
15 不好看就要多整容 —— MySQL 基于规则的优化(内含关于子查询优化二三事儿)
16 查询优化的百科全书 —— Explain 详解(上)
17 查询优化的百科全书 —— Explain 详解(下)
18 神兵利器 —— optimizer trace 的神奇功效
19 调节磁盘和CPU的矛盾 —— InnoDB 的 Buffer Pool
20 从猫爷被杀说起 —— 事务简介
21 说过的话就一定要办到 —— redo 日志(上)
22 说过的话就一定要办到 —— redo 日志(下)
23 后悔了怎么办 —— undo 日志 (上)
24 后悔了怎么办 —— undo 日志 (下)
25 一条记录的多幅面孔 —— 事务的隔离级别与MVCC
26 工作面试老大难 —— 锁
27 补充资料——专题式讲解
28 专题式讲解 —— MySQL的server层和存储引擎层是如何交互的
29 专题式讲解 —— MySQL查询成本和扫描区间(MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!)
30 专题式讲解 —— 听说有一个最左原则?这回终于讲清楚了
31 专题式讲解 —— 设计MySQL的大叔为何偏爱ref
32 专题式讲解 —— MySQL中NULL值引起的小锅
33 专题式讲解 —— MySQL使用索引执行IN子句
34 专题式讲解 —— MySQL的COUNT语句是怎么执行的
35 专题式讲解 —— MySQL的LIMIT这么差劲的吗
36 专题式讲解 —— MySQL:为什么查询列表中多了它,GROUP BY语句就会报错呢?
37 专题式讲解 —— MySQL冷知识:t1.id=t2.id=t3.id看着咋这么怪呢?
38 专题式讲解 —— MySQL乱码
39 专题式讲解 —— 字符从UTF-8转成GBK发生了什么? 40 专题式讲解 —— MySQL的定点数类型
41 专题式讲解 —— Innodb到底是怎么加锁的
42 专题式讲解 —— 语句加锁分析实例
43 专题式讲解 —— MySQL如何查看事务加锁情况
44 专题式讲解 —— MySQL介于普通读和锁定读的加锁方式—— semi-consistent read
45 专题式讲解 —— 两条一样的INSERT语句竟然引发了死锁?
46 专题式讲解 —— binlog那些事儿(一)
47 专题式讲解 —— binlog那些事儿(二)
48 专题式讲解 —— redo、undo、buffer pool、binlog,谁先谁后,有点儿乱
49 专题式讲解 —— XA事务与两阶段提交
50 给小孩子的书打个广告
51 写作本书时用到的一些重要的参考资料
52 小册答疑指南
53 后记 —— 关于写技术书籍/文章的四个指导原则

讲师介绍

小孩子:前在线教育公司「跟谁学」后端工程师,公众号「我们都是小青蛙」作者,喜欢研究源码,觉得把复杂的问题讲清楚是一件很牛逼的事儿。

(0)
上一篇 2022年10月26日 下午4:58
下一篇 2022年10月26日 下午5:19

相关推荐

发表回复

登录后才能评论