1. Mysql 基本架构示意图
1.1 连接器
用户名密码登录成功后,连接器会到权限表里查询登录账户的权限,
再次修改权限只有新建的连接才会使用新权限
show processlist //查看所有连接
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)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于