乐趣区

关于mysql:mysqlsql语句执行流程

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)

退出移动版