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)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。