MySQL执行原理
2022-07-17 21:40:33 18 举报
简单的描述了MySQL如何处理客户端请求,持续更新
作者其他创作
大纲/内容
客户端
③可以进行查询缓存处理
③排序列全来自关联首表时直接排序,不生成临时文件;此外先将关联结果存入临时表,再进行排序。
命中
④MySQL5.6之前先进行排序,后判断limit子句;5.6之后先处理limit。
连接器
检查“读查询结果”是否可缓存,然后执行相应操作
③查询中包含用户自定义函数,存储函数,用户变量,临时表,系统表……时不会被缓存
关联查询为嵌套循环查询,当取出关联表所有行时为“笛卡尔积”
生成解析树,SQL语法分析
生成执行计划(一种数据结构,非字节码)
⑥InnoDB让任何加锁的事务操作都不使用查询缓存
①数据量小时内存排序,大时使用磁盘。
解析器
储存引擎
缓存(完全储存在内存中)8.0已弃用
以表为单位生成handler接口实例,进行静态,动态优化处理
hint
②根据“排序缓冲区”划分文件,文件内使用快速排序,文件间使用归并排序。
④通过MySQL客户端/服务器通信协议的封包发送,再通过TCP协议发送,TCP可以对封包进行缓存后批量传输
②从开始生成第一个结果开始,以行为单位增量、逐步返回结果集,并非一次全部返回
扫描行数
检查SQL语句是否以sel(不区分大小写)开头
⑤对查询缓存的操作是一个加锁排他操作
是否存在文件排序
是否生成临时表
预处理
①查询到:返回结果集;未查询到:返回一些查询信息,例如行数
优化器
数据结果
子查询创建的临时表没有任何索引
④子查询,存储过程,MySQL5.1之前的绑定变量无法使用查询缓存
基于“基数”判断。基数是一个索引上不同值的个数,即区分度。InnoDB默认选择N个数据页,取单页不同值的平均值,再×N得到基数
②缓存若想命中必须对应SQL语句完全(空格、注解也不能有)相同
①缓存存放在一个引用表中,通过一个哈希值引用(哈希值包括查询本身,当前要查询的数据库,客户端协议的版本等信息)
索引选择
未命中
执行器
MySQL5.6默认InnoDB
0 条评论
回复 删除
下一页