MySQL可以分为连接层、服务层和引擎层
连接层
- 客户端发起请求,MySQL服务器会从数据库连接池中取出一个线程对接,TCP三次握手后建立连接。
- 客户端发起身份验证(用户名、密码),验证失败:Access denied for user,验证成功则连接成功
服务层
**SQL api:**提供api供客户端调用,如crud
**缓存:**相同的请求缓存一份结果,因为命中率低,新版本MySQL已经废弃
**解析器:**将原始sql经过预发解析后生成语法树,会校验sql语法是否正确,用户是否有权限等
**优化器:**对sql进行优化处理,生成执行计划
如
CREATE TABLE s1
(
id INT AUTO_INCREMENT,
key1 VARCHAR(100),
key2 INT,
key3 VARCHAR(100),
key_part1 VARCHAR(100),
key_part2 VARCHAR(100),
key_part3 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY (id),
KEY idx_key1 (key1),
UNIQUE KEY idx_key2 (key2),
KEY idx_key3 (key3),
KEY idx_key_part (key_part1, key_part2, key_part3)
) ENGINE = INNODB
CHARSET = utf8;
初始sql是这样的,不符合最左匹配原则
explain
select *
from s2
where key_part2 = 'a'
and key_part1 = 'b';
经过优化器优化后变为
explain
select *
from s2
where key_part1 = 'b'
and key_part2 = 'a';
结果
引擎层
负责物理数据的读取和写入,直接与磁盘打交道,通过api与服务层交互