借鉴掘金小册,小孩子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服务器会对这些进行认证,如果认证失败服务器会拒绝连接。
解析与优化
这部分比较重要的分别是查询缓存、语法解析和查询优化。
查询缓存
如果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;