1. Mysql基本架构示意图

![上传中...]()

1.1 连接器

用户名密码登录成功后,连接器会到权限表里查询登录账户的权限,
再次修改权限只有新建的连接才会使用新权限

show processlist //查看所有连接

![上传中...]()

wait_timeout  //客户端无反应超时断开时间,默认为8小时

MySQL 在执行过程中临时使用的内存是管理在连接对象里面的,这些资源会在连接断开的时候才释放
如果内存占用太大,会被系统强行杀掉
解决方案:
1.定期断开链接,程序里判断下执行过一个占用大内存的查询后,断开链接再重连
2.mysql5.7以后 ,可以执行mysql_reset_connection来初始化链接,恢复到刚刚创建连接的状态(此处存疑,有说此方法是C语言API调用)

2.查询缓存

拿到执行语句时,mysql会去判断是否最近执行过,如果缓存缓存中有执行结果,直接返回(查询语句需保持一致性,且数据没有被修改过)
由于缓存失效性很强,故不推荐使用查询缓存,且8.0版本后无此功能
通过调整参数,可以按需使用,默认查询不适用缓存,指定查询使用

query_cache_type=demand  //设置按需加载
mysql> select SQL_CACHE * from T where ID=10;//使用查询缓存

3.分析器

分析器会对sql语句做解析
首先是词法分析,识别出字符串分别是什么,代表什么
其次是语法分析,判断是否满足mysql语法

4.优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序

5. 执行器

首先校验下登录账户对表T是否具有查询的权限(优化器之前也会调用precheck验证权限),
其次执行器会调用存储引擎接口扫描接口,并做扫描行数累加(rows_examined)


AshShawn
6 声望2 粉丝