服务器处理客户端请求
总的来说,Mysql可以分为服务层和存储引擎层两部分。具体细分,Server层包括连接层,查询缓存,分析器,优化器,执行器等。
1. 连接层
连接层的功能是Mysql服务器对TCP传输过来的账号密码做身份认证,权限验证,维持和管理连接,一个用户一旦建立连接,即使管理员用户对这个用户的权限进行了修改,但也不会影响已经存在连接的权限。修改完成后,只有建立新的连接才会使用新的权限设置。
2. 查询缓存
查询缓存的功能是当Mysql服务器获取到一个查询请求后,如果查询缓存命中了该请求,则会直接将结果返回给客户端,反之则会继续后续的执行操作。其中缓存中保存的是之前执行过的语句及其结果,其保存格式为key-value,key是查询的语句,value则是查询的结果。但大多数情况下查询缓存没有太大作用,因为只有相同的查询操作才会命中查询缓存,如果两个查询请求在任何字符上不同(大小写不一致、注释、空格),都会导致缓存不会命中,且请求中包含一些系统函数,用户自定义变量和函数(NOW),每次查询的时间都不一致,如果使用之前的查询结果会导致结果错误。Mysql的缓存系统会检测涉及到的每张表,只要该表的结构或者数据被修改(如使用insert,update,delete,truncate table,alter table,drop table和drop database等),那么该表的所有高速缓存都将会失效并且移除,对于更新压力大的数据库而言,查询缓存命中低。
3. 分析器
分析器的功能是对SQL语句进行词法分析,语法分析,语义分析。
3.1 词法分析
分析器会做词法分析,识别出sql语句中每个字符串分别是什么,代表什么。比如select id from T
,把字符串‘T’识别称表名‘T’,字符串‘id’识别成‘列id’。
3.2 语法分析
语法分析器会将词法分析的结果根据语法规则,判断sql语句是否满足mysql语法,如果sql语句正确,则会生成语法树。
4. 优化器
优化器的目的是在表里面有多个索引时,决定使用哪个索引,或者在一个语句有多表关联时,决定各个表的连接顺序。
5.执行器
完成上述操作,还没有真正去读写真实的表,仅仅只是产出了一个执行计划,于是就进入了执行器阶段,在执行之前需要判断该用户是否具备权限 。如果没有,就会返回权限错误。如果具备权限,就执行 SQL 查询并返回结果。