前言

最近刚开始再看《Mysql 是怎样运行的 – 从根儿上理解 MySQL》,迫于见明的压力,在此开始写一些笔记也好或者对于该书获取的一些知识点提炼出来


架构图

image.png>

  • 建立连接

就跟大部分的开源组件的模式一样,client 和 server。client 具体为 api,在不同的应用方进行调用;server 具体实现业务如存储,查询,分词等一些逻辑。当然,client 与 server 之间的连接是有通过我们熟悉的 tcp 连接,还有命名管道和共享内存,UNIX 域套接字

  • 解析与优化

mysql 服务器从客户端那获得了文本形式的请求,接下来数据要从存储中取出来,还需要很多前置的过程,比如:要取什么数据(对于 sql 语句需要做出分析传递给下一层),怎么取是最快,这部分做这件事情

  • 存储引擎

当服务完成了查询优化以后,都还没有真正地去访问真实的表中数据(在查询期间可能会访问表中少量的数据)。因此,mysql 服务器把数据的存储和提取操作都封装到存储引擎模块(表处理器)中。从逻辑上,表示一行一行的记录组成。在物理上,如何表示记录,怎么读取记录,把数据写入具体的物理存储器,这些都存储引擎负责的事情。同时存储引擎是各种各样的,可以根据用户自己选择去使用,因此作为开发者的我们可以自己开发一套存储引擎去使用


建立连接

  • TCP/IP

在真实的环境中,数据库服务器进程和客户端进程可能会运行在不同的主机中,因此必须网络进行通讯。mysql 服务器中默认的端口号是 3306,默认监听 3306 端口。因此我们就可以通过 IP 地址 + 端口号的方式与这个进程建立连接,这样进程间就可以进行网络通讯。下面一些关于网络连接用到的指令

1
2
mysqld -P3307

1
2
mysql -h127.0.0.1 -uroot -P3307 -p

  • 命名管道和共享内存

windows 用户可以用这招,我就不细了解

  • UNIX 域套接字

服务器进程和客户端进程都运行在操作系统为类 UNIX 的同一台机器上,就可以使用这个方法进行进程间通讯。不细聊了


连接管理

  • 线程池

当每有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程专门处理这个客户端的交互:当该客户端退出时会与服务器断开连接,服务器并不会直接把和客户端交互建立起来的线程销毁,而是把他缓存起来,当另一个新的客户端再进行连接时,把这个缓存的线程分配给新客户端。这样就避免了频繁创建和销毁线程,节省开销。mysql 服务器是为每一个进来的客户端分配一个线程,这样的问题就会有,加入线程分配的太多就会严重影响系统性能,所以我们也需要限制可以同时连接到服务器的客户端数量,也就是我们日常口中经常提到的连接池,mysql 也把这个字段开放出来,让我们来配置,因此这个配置的数值很考验开发者对我们的机器资源以及需要什么样的性能要有一个很深刻的理解。

  • 身份认证

当客户端发起连接时,是会携带主机信息、用户名、密码等信息,服务器程序就会对客户端提供的这些信息进行认证。如果认证失败,服务器就会拒绝连接。同时,当客户端与服务器是部署在不同的地方,可以采用传输层安全性协议对连接进行加密

解析与优化

  • 查询缓存(5.7.20 以后不推荐使用,8.0 中直接将其删除)

我在平时开发的过程中,当缓存中没有数据时,一次数据获取都从调用 BI 的数据接口来获取。但是为了提高效率,会把刚刚查询的结果放入缓存中,这样在短时间内再查询一次就能提高查询的效率,不需要做过多的计算。mysql 也是如此,但是 mysql 对于两个查询请求有任何字符上面的不同(例如,空格、注释、大小写),都会导致缓存不会命中。另外,查询中包含某些函数、用户自定义变量和函数、系统表,如 mysql、information_schema、performance_schema 数据库中的表,这个请求也不会命中。当然,缓存也会有缓存失效的时候,只要表的结构或者发生了更改或者数据发生了修改,对应的所有缓存表全部失效

  • 语法解析

我们知道客户端程序发送过来的请求指示一段文本,mysql 服务器首先要对这段文本进行分析。属于编译过程了,设计词法解析、语法解析、语义分析,不深聊了

  • 查询优化

语法解析之后,服务器已经获得了需要的信息(要查询的表和列是哪些、搜索条件是什么)。但是我们写的 mysql 语句执行起来效率可能并不是那么高,所以 mysql 的优化程序会对我们的语句做一些优化,优化结果就是生成一个执行计划(explain),这个执行计划表明了应该用哪些索引执行查询,以及表之间额查询顺序是啥,等等。


存储引擎

mysql 服务器把数据的存储和提取操作都封装到了一个名为存储引擎的模块中,mysql 中有很多存储引擎,但是最常用的还是 InnoDB,偶尔用一下 MyISAM,再偶尔用一下 MEMORY

  • InnoDB

支持事务、行级别、外键

  • MyISAM

主要的非事务处理存储引擎

  • MEMORY

数据只存储在内存,不存储在磁盘;多用于临时表


其他

本来想写第二章的内容,启动选项和系统变量,但是发现感觉不是很有必要,后面有必要再补上