MySQL可以分为Server层和存储引擎层两部分。
Server层
主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图。
Store层
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持Innodb、MyISAM、Memory等多个存储引擎。现在最常用的是InnoDB,在创建表时,不指定标的存储引擎类型,默认会设置为InnoDB。
连接器
通过客户端连接MySQL数据库,客户端要向mysql发起通信都必须先跟Server端建立通信,而建立连接就是连接器完成的。
第一步 连接数据库,连接器负责跟客户端建立连接、获取权限、维持和管理连接。
mysql ‐h host[数据库地址] ‐u root[用户] ‐p root[密码] ‐P 3306
完成经典的TCP握手以后,连接器就开始认证身份,输入用户名和密码。
查询缓存
show database;
use dbname;
show tables;
describe user; (获取mysql数据库中user表的列信息)
MySQL拿到一个查询请求以后,会先查询缓存之前是否执行过这条语句,如果有直接返回缓存中的结果。之前执行过的语句会以key-value的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。
但大多数查询缓存是个鸡肋:因为查询缓存失效非常频繁,只要有对一个表更新,这个表上所有的查询都会被清空。
建议在静态表(极少做更新修改的表,系统配置表等等)可以修改my.cnf参数query_cache_type设置为DEMAND(2,OFF - 0; ON - 1; 2 - DEMAND)
这样对于默认SQL语句都不使用查询缓存。而对你确定要使用查询缓存的语句可以像如下方式写:SELECT SQL_CACHE * FROM test;
分析器
如果没有命中查询缓存,就要开始真正执行语句了。首先会做“词法分析”识别出里面的字符串分别是什么,代表什么。
词法分析器原理
1. 词法分析
2. 语法分析
3. 语义分析
4. 构造执行树
5. 生成执行计划
6. 计划的执行
SQL语句的分析分为词法分析与语法分析,语法分析由Bison生成。
优化器
在开始真正执行前,还要先经过优化器的处理。
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各表的连接顺序。
select * from test1 join test2 using(ID) where test1.name='a' and test2.name='b';
在执行时既可以先从表test1里面取,再根据ID值关联到表test2,在判断test2里面name的值 也可以先从test2里面取,再根据ID关联到表test1,在判断test1里面name的值;
执行器
开始执行的时候,先判断对这个表T有没有查询权限,没有会返回没有权限的错误。
select * from test where id = 1;
id字段没有索引,那么执行器的执行流程是这样的(按条件遍历):
1. 调用InnoDB引擎接口去这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;
2. 调用引擎接口取下一行,重复相同的判断逻辑,知道取到这个表的最后一行;
3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
rows_examined字段:表示这个语句执行过程中扫描了多少行,这个值就是在执行器每次调用引擎获取数据行时累加的。
bin_log归档
MySQL会将执行SQL语句的执行逻辑记录在bin-log中。
binlog是Server层实现的二进制日志,记录我们的CUD操作,当不小心误删数据库,我们可以使用binlog进行归档,开启MySQL中的binlog功能。
log-bin=/usr/local/mysql/data/binlog/mysql-bin
binlog-format=ROW #binlog有3种格式: statement, row, mixed
sync-binlog=1 #表示每1次执行写入就与硬盘同步,会影响性能,为0时表示,事务提交是mysql不做刷盘操作