前言:
今天学习了计算机组成原理的算术逻辑单元- ALU
:
串行加法器
(全加器
+进位触发器
)行波进位器
- 串行进位的并行加法器(串联全加器 - FA
)并行进位器
中的 组内并组间串 与 组内并组间并 (多4位先行进位电路
串联或并联)
设计之精妙令人赞不绝口,醍醐灌顶!之前一直想不通的问题,如今也逐渐豁达。希望大家都能注重底层的学习,不要只着眼于伟人为我们搭建的空中楼阁!今天时间有限,稍微复习一下MySQL的基础知识。
1. MySQL基本架构示意图
2. MySQL执行流程
查询语句
执行流程:
3. 概念分析与解释
3.1 连接器
第一步,你会先连接到这个数据库上,这时候接待你的就是连接器。
连接器:
负责跟客户端建立连接、获取权限、维持和管理连接。成功建立连接后,即使用管理员账号对当前用户的权限进行修改,也不会影响到已经连接的用户权限。wait_timeout默认值是8小时,超时未操作会自动断开。
长连接:
指连接成功后,如果客户端持续有请求,则一直使用同一个连接。
短连接:
指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
长连接和短连接的选择:
连理连接的过程通常比较复杂。应尽量减少连接的频率,因此尽量使用长连接。
长连接的弊端:
MYSQL在执行过程中临时使用的内存是管理在连接对象里面的,连接断开时才释放,长连接累积下来会导致内存过大,导致MYSQL异常重启。
长连接弊端的解决方案:
- (1)定期断开长连接。
- (2)MYSLQ5.7及以上版本在每执行完一个比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源。不需要重连和权限验证,将连接恢复到刚刚创建完成的状态。
查询缓存(8.0版本开始删掉此功能):
MySQL 拿到一个查询请求后,会先到查询缓存判断之前是否执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。
查询缓存的弊端:
只要某个表进行数据更新,这个表上所有的查询缓存都会被清空。对于更新压力大的数据库来说,查询缓存的命中率会非常低。因此不建议使用查询缓存。若为一张静态表,很久才会更新一次则适合使用查询缓存。
3.2 分析器
MySQL 需要知道你要做什么,因此需要对 SQL 语句做解析。
- 分析器先会做词法分析。mysql需要识别出用户输入的字符串分别代表什么
- 再做语法分析。根据词法分析结果判断输入的sql是否满足语法
3.3 优化器
优化器
是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
-- 1.先表t1取 c=10记录的id值,再根据id值关联表t2,在判断t2中的d=20
-- 2.先表t2取 d=20记录的id值,再根据id值关联表t1,再判断t1中的c=10
以上两种方案逻辑结果相同,但效率会有不同;优化器的作用就是决定选择使用哪一种方案。
3.4 执行器
先判断用户对当前表是否有执行查询的权限,再根据表的引擎定义使用表对应的引擎提供的接口。
没有索引的执行流程:
- 调用InnoDB引擎接口取当前表的第一行,判断ID是不是10,如果不是则跳过,如果是则将这行存入结果集中
- 调用引擎接口取下一行,重复判断至最后一行。
- 将上述遍历过程中满足条件的行组成记录集作为结果集返回给客户端。
有索引的执行流程:
执行的逻辑也差不多。第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。