Python社区  »  DATABASE

MySQL 执行过程

xiaoxiunique • 4 月前 • 63 次点击  
阅读 11

MySQL 执行过程

mysql 执行过程

mysql 架构图

表结构

student

id name age sex deptId
1 xiaoming 18 male 1
2 xiaohong 20 felmale 2

dept

id name
1 superAdmin
2 guest

sql

select 
	student.id as studentId,  
	student.name as studentName,
	student.age as studentAge,
	student.sex as studentSex,
	dept.name as deptName
from student
left join dept on student.deptId = dept.id
where student.id = '1'
order by student.age desc
复制代码

sql **执行过程

mysql 主要由, server层和存储层两部分构成.

server 层主要包括连接器, 查询缓存, 分析器, 优化器, 执行器

连接器

连接器主要负责将mysql 客户端和服务端建立连接,会获取当前用户的权限. 这里获取到的权限对整个连接都有效,一旦连接成功后,如果使用管理员账号对用户更改查询,在当前连接中拥有的权限保持不变,值有等到下次重新连接才会更新权限

查询缓存

连接成功之后,即开始要正式执行select语句了, 但是在执行查询之前, mysql会去看下有没有该条语句的查询缓存内容,如果有缓存 直接从缓存中读取并返回结果, 不需要在执行后面的步骤, 结束查询操作. 如果没有缓存则接着往后执行,并将执行语句和结果保存到缓存中

注意: mysql8 之后已经没有这个功能了, 因为这个缓存区太容易刷新,效果并不是太大

解析器

当没有查询到缓存, 就需要开始执行sql语句了, 在执行之前肯定需要对sql语句进行解析.

分析器主要对sql语句进行语法和语义分析, 检查单词拼写是否错误, 还有检查要查询的表或字段是否存在,如果分析器检测出有错误就会返回类似"you have an error in you sql "这样的错误信息,并结束查询操作.

优化器

当通过分析器之后, mysql算是理解了你要执行的操作,但是通常对于一个sql,mysql内部可能存在多种执行方案,比如存在多个索引,该选择哪个索引,多个表关联查询,怎么确认各个表的连接顺序.

多个方案的执行结果都一样,但是执行效率不一样,所以mysql在执行之前需要尝试找出最优方案来,这就是优化器主要工作

执行器

当经过优化器后,就到了执行器执行sql了. 在前面连接器处已经读取到当前用户的权限了, 连接器中只是获取到权限,并没有对权限进行判断和效验.

所以在执行器中, 在执行语句之前会判断权限, 如果没有对应的权限则会直接返回并提示没有相关权限.

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32813
 
63 次点击  
分享到微博