点击上方蓝色“石杉的架构笔记”,选择“设为星标” 回复“PDF”获取独家整理的学习资料!
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20210305_4ff5cb1a-7d47-11eb-93f0-38f9d3cd240d.png)
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20210305_4fff138c-7d47-11eb-93f0-38f9d3cd240d.png)
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20210305_500adf14-7d47-11eb-93f0-38f9d3cd240d.png)
长按扫描上方二维码一元抢购
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20210305_50193604-7d47-11eb-93f0-38f9d3cd240d.png)
查询请求在MySQL中的处理流程
MySQL 中处理SQL的组件介绍,包括:
连接器
查询缓存
分析器
优化器
执行器
代码段1
客户端不言而喻,主要负责与MySQL Server层建立连接,发送查询请求以及接受响应的结果集。 MySQL Server层,主要包括连接器、查询缓存、分析器、优化器、执行器等。这些组件包含了MySQL的大部分主要功能,例如平时使用最多的存储过程、触发器、视图都在这一层中。 还有一个通用的日志模块 bin log。l MySQL 存储引擎层,主要负责数据的存储和提取。其支持多个存储引擎,例如:InnoDB、MyISAM等。常用的有InnoDB,它从MySQL 5.5.5版本开始成为了MySQL的默认存储引擎,重要的是InnoDB 引擎包含了自带的日志模块 redo log,这个在后面讲述更新语句的时候会着重提到。
连接器
长连接是指连接成功后,客户端请求一直使用是同一个连接。
短连接是指每次执行完SQL请求的操作之后会断开连接,如果再有SQL请求会重新建立连接。
定期断开长连接,每隔一段时间或者执行一个占用内存的大查询以后断开连接,从而释放内存,当查询的时候再重新创建连接。
MySQL 5.7 或者更高的版本,通过执行 mysql_reset_connection 来重新初始化连接。此过程不会重新建立连接,但是会释放占用的内存,将连接恢复到刚刚创立连接的状态。
查询缓存
分析器
优化器
逻辑变换
否定消除:针对表达式“和取”或“析取”前面出现“否定”的情况,应将关系条件进行拆分,从而将外层的“NOT”消除。
等值常量传递:利用了等值关系的传递特性,为了能够尽早执行“下推”运算。“下推”的基本策略是,始终将过滤表达式尽可能移至靠近数据源的位置。
常量表达式计算:对于能立刻计算出结果的表达式,直接计算结果,同时将结果与其他条件尽量提前进行化简。
代价优化
赋值操作代价:针对每个数据库操作(创建表、返回数据集)设置对应的代价,这个代价值一般设置为1、0.2之类的值,没有具体的含义就是对操作的代价定义。
计算操作数量:将SQL语句中涉及到的操作进行逻辑,并且做计算。说白了就是看这次SQL请求需要做哪些具体的数据库操作。
求和操作代价:既然知道SQL由哪些数据库操作组成,同时知道每个操作对应的代价,求和以后就是知道整体SQL执行的代价。
选择代价计划:如果说没给SQL执行的操作都是一个计划,那么这些操作的不同组合就会对应不同的计划,这里需要选择整体执行代价最低的操作计划,作为这次执行SQL语句的代价计划,从而达到总代价最低。
row_evaluate_cost (default 0.2) 计算符合条件的行的代价,行数越多,此项代价越大
memory_temptable_create_cost (default 2.0) 内存临时表的创建代价
memory_temptable_row_cost (default 0.2) 内存临时表的行代价
key_compare_cost (default 0.1) 键比较的代价,例如排序
disk_temptable_create_cost (default 40.0) 内部myisam或innodb临时表的创建代价
disk_temptable_row_cost (default 1.0) 内部myisam或innodb临时表的行代价
io_block_read_cost (default 1.0) 从磁盘读数据的代价,对innodb来说,表示从磁盘读一个page的代价
memory_block_read_cost (default 1.0) 从内存读数据的代价,对innodb来说,表示从buffer pool读一个page的代价
执行器
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20210305_5127de9c-7d47-11eb-93f0-38f9d3cd240d.png)