Mysql 是怎样运行的

初识

服务器处理客户端请求

大致需要经过三个部分,分别是连接管理解析与优化存储引擎

image-20210221105026446

客户端可以采用TCP/IP命名管道或共享内存Unix域套接字等方式与服务器建立通信

每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务器断开连接,服务器并不会立即把与该客户端交互的线程销毁掉,而是把它缓存起来,在另一个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端 。

当连接建立后,与该客户端关联的服务器线程会一直等待客户端发送过来的请求

解析与优化

查询缓存

如果两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。另外,如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如 mysql 、information_schema、 performance_schema 数据库中的表,那这个请求就不会被缓存

MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,如对该表使用了INSERTUPDATEDELETETRUNCATE TABLEALTER TABLEDROP TABLEDROP DATABASE语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除

虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存而造成一些开销,比如每次都要去查询缓存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从MySQL 5.7.20开始,不推荐使用查询缓存,并在MySQL 8.0中删除。

字符集的比较规则

将一个字符映射成一个二进制数据的过程叫编码, 将一个二进制数据映射到一个字符的过程叫解码

InnoDB 记录存储结构

InnoDB 是一个将表中的数据存储到磁盘上的存储引擎.

InnoDB 将数据分成若干个页, 以页作为磁盘和内存间交互的基本单位.

InnoDB 中页的大小一般为 16KB. 一般情况下, 一次最少从磁盘中读写 16KB 的数据.

InnoDB 行格式

COMPACT, REDUNDANT, DYNAMIC, COMPRESSED

指定行格式的语法

CREATE TABEL TABEL_NAME () ROW_FORMAT=COMPAC

COMPACT 行格式

image-20230730162631737

COMPACT行格式中, 所有变长字段的真实数据占用的字节数都存放在记录的开头位置, 从而形成一个变长字段长度列表,各变长字段的真是数据占用的字节按照列的顺序_逆序_存放

image-20230730165941469

InnoDB 主键生成策略

如果user没有定义主键, 则选取一个不允许存储 NULLUNIQUE键作为主键. 如果表中不存在不为NULLUNIQUE键, 则 InnoDB会为表添加一个名为row_id的隐藏列作为主键

数据页格式