第一讲 基础架构
MySql分为Server层和存储引擎层两部分
连接器:管理权限,权限验证
查询缓存:命中就直接返回结果
分析器:词法分析,语法分析
优化器:执行计划生成,索引选择
执行器:操作引擎,返回结构
存储引擎层
连接器
连接命令:
mysql -h localhost -P port -u root -p
C:\Users\Ha>mysql -u root -p
Enter password: ****
用户名密码认证通过,连接器回到权限表查到权限。并且这次连接权限判断只依赖于这时读到的权限,修改权限表也改变不了已经建立的连接的权限
建立连接过程复杂,要尽量减少建立连接的动作,尽量使用长连接
MySQL执行过程中使用的内存管理在连接对象里面,这些资源会在连接断开才释放,所以长连接累积下来导致内存占用过大,被系统强行杀掉OOM,现象上看就是MySql异常重启
方案 1
定期重连长连接,或者程序判断执行过一个占用内存的大查询后重连连接
方案2
MySql5.7以上的版本执行一个比较大的操作后通过执行mysql_reset_connection来重新初始化连接资源,不是重连,是恢复到刚创建完的状态,不用权限验证,
查询缓存
连接建立完,之前查询的语句和结果会KV形式存在内存中,如果有就直接返回,没有就继续执行,然后把查询结果变成缓存,类似于操作系统快表
不建议使用查询缓存,查询缓存弊大于利:——
查询缓存失效频繁,对一个表更新,表的所有缓存会被清空。所以对更新压力大的数据库,查询缓存命中率很低,不随意变的表才需要查询缓存,类似redis
可以用SQL_CACHE显式指定查询缓存语句,但是MySQL8.0以后这个功能删除了
分析器
词法分析
通过关键字知道是CRUD哪一个语句,并且把字符名称赋予意义,比如T是表T的表名,U是列U的列名
语法分析
判断是否满足mysql语法,报错一般是 you have an error in your SQL synax;blablabla
优化器
表里有多个索引时优化器决定使用哪个索引,
一个语句多表join优化器决定各个表的连接顺序
执行器
判断对于表的权限(命中缓存的时候返回数据的时候检查权限(precheck))
查询也会在优化器之前检查权限
有权限再打开表继续执行
select * from T where ID = 10
执行器流程
上面语句当ID没有索引的时候
- 调用InnoDB引擎接口从第一行往下开始遍历比较ID,符合条件的加入结果集,最后返回给客户端
ID有索引的时候类似,是从符合条件的ID中遍历