# Mysql架构


### 数据库架构与 SQL执行过程
-->连接器-->语法分析器-->语义分析与优化器-->执行引擎

应用程序需要对数据库连接进行管理,一方面通过连接池对连接进行管理,空闲连接会被及时释放;另一方面微服务架构可以大大减少数据库连接

语法分析器生成的抽象语法树并不仅仅可以用来做语法校验,它也是下一步处理的基础。语义分析与优化器会对抽象语法树进一步做语义优化

连接器收到 SQL 以后,会将 SQL 交给语法分析器进行处理,语法分析器工作比较简单机械,就是根据 SQL 语法规则生成对应的抽象语法树

语义分析与优化器最后会输出一个执行计划,由执行引擎完成数据查询或者更新。

### 使用 PrepareStatement 执行 SQL 的好处
一个是 PrepareStatement 会预先提交带占位符的 SQL 到数据库进行预处理,提前生成执行计划,当给定占位符参数,真正执行 SQL 的时候,执行引擎可以直接执行,效率更好一点。

另一个好处则更为重要,PrepareStatement 可以防止 SQL 注入攻击。

### 数据库文件存储原理
B+ 树是一种 N 叉排序树,树的每个节点包含 N 个数据,这些数据按顺序排好,两个数据之间是一个指向子节点的指针, 而子节点的数据则在这两个数据大小之间。

一种是聚簇索引,聚簇索引的数据库记录和索引存储在一起,上面这张图就是聚簇索引的示意图,在叶子节点,索引 1 和记录行 r1 存储在一起,查找到索引就是查找到数据库记录。像 MySQL 数据库的主键就是聚簇索引,主键 ID 和所在的记录行存储在一起。MySQL 的数据库文件实际上是以主键作为中间节点,行记录作为叶子节点的一颗 B+ 树。
![img.png](/images/B+tree.png)

另一种数据库索引是非聚簇索引,非聚簇索引在叶子节点记录的就不是数据行记录,而是聚簇索引,也就是主键

通过 B+ 树在叶子节点找到非聚簇索引 a,和索引 a 在一起存储的是主键 1,再根据主键 1 通过主键(聚簇)索引就可以找到对应的记录 r1,这种通过非聚簇索引找到主键索引,再通过主键索引找到行记录的过程也被称作回表
![img.png](/images/B-tree.png)

### 基础架构
![img.png](/images/mysql_prerare.png)
#### 连接器
命令：
```
Mysql -h$ip -P$port -u$user -p
```
查看mysql是否是空闲状态：
```
Show processlist
```
其中的Command 列显示为“Sleep”的这一行，就表示现在系统里面有一个空闲连接。

长连接和短链接：

长连接是指连接成功后，如果客户端持续有请求，则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接，下次查询再重新建立一个。

查询缓存

将参数 query_cache_type 设置成 DEMAND，这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句，可以用 SQL_CACHE 显式指定，像下面这个语句一样：
```
Select SQL_CACHE * from T where id = 10;
```
Mysql8.0以上版本不在适用。

#### 分析器
词法分析->语法分析

#### 优化器
在表里面有多个索引的时候，决定使用哪个索引；或者在一个语句有多表关联（join）的时候，决定各个表的连接顺序。

#### 执行器
判断是否有执行查询的权限

慢查询日志中看到一个 rows_examined 的字段，表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。

引擎扫描行数跟rows_examined 并不是完全相同的。

