1. 概述
2. 具体
2.1 连接器
连接器主要用来管理连接和权限验证。每当有一个客户端进程连接到服务器时,服务器都会创建一个线程来专门处理与这个客户端的交互。在客户端发起连接时,需要携带主机信息、用户名、密码,服务器会对这些信息进行验证,如果验证失败,会拒绝连接。当连接建立后,负责处理该客户端的线程会一直等待该客户端发送请求。
当连接数超过最大连接数,服务器也会拒绝连接。
## 查看数据库最大连接数show variables like 'max_connections';
2.2 缓存
MySQL服务器在处理查询请求时,会先去缓存中查询刚刚是否处理过,如果查到了则直接返回。当表的结构或者数据被更改时,该表相关的缓存会被全部删除。由此可见,缓存的失效会非常频繁,对于频繁更新的表来说,缓存几乎没有什么作用,所以其实是不推荐使用缓存的。
从MySQL 5.7.20开始,不推荐使用查询缓存,并在MySQL 8.0中删除。
**
2.3 解析器
解析器主要由两部分组成:词法分析和语法分析。
- 词法分析:MySQL会将输入的sql语句进行分词,解析出每个分词的意义。
- 语法分析:MySQL会根据语法规则,判断输入的sql是否满足MySQL的语法。
如果sql语句出现错误,服务器会直接返回You have an error in your SQL syntax...
2.4 优化器
MySQL优化器会对我们的sql语句做一些优化,生成一个执行计划,这个执行计划表明了应该使用那些索引进行查询,表之间的链接顺序,可以使用explain语句来查看执行计划。
2.5 执行器
执行器主要做的事情就是根据执行计划调用存储引擎的接口,获取结果集并返回。
2.6 存储引擎
MySQL服务器把数据的存储和提取操作都封装到了一个叫存储引擎的模块里。我们知道表是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎负责的事情。为了实现不同的功能,MySQL提供了各式各样的存储引擎,不同存储引擎管理的表具体的存储结构可能不同,采用的存取算法也可能不同。
我们比较常用的存储引擎主要是InnoDB和MyISAM。通过show engines语句可以看到MySQL支持的存储引擎,如下表所示:
| Engine | Support | Comment | Transactions | XA | Savepoints |
|---|---|---|---|---|---|
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
其他
参考
《高性能MySQL》
《MySQL技术内幕:InnoDB存储引擎》
《MySQL 是怎样运行的:从根儿上理解 MySQL》
《MySQL实战45讲》
