借鉴掘金小册,小孩子4919MySQL是怎样运行的:从跟上理解MySQL

MySQL复习


MySQL客户端服务器架构

MySQL服务器:与存储数据打交道,对客户端发来的SQL语句进行解析。

MySQL客户端:需要用户名和密码登录。

MySQL使用流程:1.启动MySQL服务器2.启动MySQL客户端3.客户端对服务器发送请求

启动后MySQL服务器进程的默认名称为mysqld,客户端名称为mysql。

MySQL的客户端和服务器使用TCP作为网络通信协议,MySQL服务器启动时会默认申请3306端口,之后等待客户端进行连接,也可以自行指定端口比如,

mysqld -P3307

这样MySQL服务器在启动时就会监听指定的3307端口。

客户端想指定连接的MySQL服务器可以-h指定IP地址,-P指定端口

mysql -h127.0.0.1 -uroot -P3307 -p

MySQL客户端发送一段SQL语句,MysSQL服务器返回一段文本的大致过程为

mysql 客户端登陆_mysql 客户端登陆

主要分为:连接管理、解析与优化、存储引擎三部分。

连接管理

MySQL服务器当收到MySQL客户端的连接请求时,会创建一个线程专门与这个客户端进行交互,当这个客户端断开连接时,它不会立即销毁线程,而是把它缓存起来,当另一个客户端连接时直接分配给在这个客户端,但是线程分配太多会影响性能,所以MySQL服务器可以限制连接的客户端数量。

MySQL服务器请求连接中会带有主机信息,用户名,密码。MySQL服务器会对这些进行认证,如果认证失败服务器会拒绝连接。

 

解析与优化

这部分比较重要的分别是查询缓存、语法解析和查询优化。

查询缓存

如果A客户端查询一条信息服务器会将查询请求和结果缓存起来,当其他用户发送相同请求时会直接返回。

但是查询缓存要求查询语句完全相同,甚至包括空格、大小写、注释,而一些系统表的数据也不会缓存,比如Now()每次都返回不同结果。

当查询请求访问的表被insert、update、drop、truncate、drop database时,缓存会全部删除

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

语法解析

判断语法是否正确,本质上是以一个编译的过程,把查找表和信息放到MySQL服务器上。

查询优化

优化程序会对语句做一些优化,如外连接转换为内连接、表达式简化、子查询转为连接吧……

 

存储引擎

逻辑上表是一行一行记录的,但是物理上是由存储引擎控制的,它控制怎么把数据写入具体的物理存储器上,怎么从表中读数据,MySQL也提供了多种应对不同需求的存储引擎。

MySQL支持非常多种存储引擎,我这先列举一些:

存储引擎

描述

ARCHIVE

用于数据存档(行被插入后不能再修改)

BLACKHOLE

丢弃写操作,读操作会返回空内容

CSV

在存储数据时,以逗号分隔各个数据项

FEDERATED

用来访问远程表

InnoDB

具备外键支持功能的事务存储引擎

MEMORY

置于内存的表

MERGE

用来管理多个MyISAM表构成的表集合

MyISAM

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

NDB

MySQL集群专用存储引擎

InnoDB是MySQL默认的存储引擎 。

查看存储引擎

show engines

创建表时设置存储引擎

CREATE TABLE aaa(i int)ENGINE=存储引擎(InnoDB);

修改表的存储引擎

ALTER TABLE aaa ENGINE=MyISAM;