现在的位置: 首页 > 综合 > 正文

Mysql学习笔记:Mysql服务器体系结构(二)

2012年11月08日 ⁄ 综合 ⁄ 共 3737字 ⁄ 字号 评论关闭

解析器:

解析器负责解析查询并生成解析树。它首先查询高速缓存看当前的查询是否是高速缓存的类型

并且存在。如果找到的话,高速缓存结果被返回给用户,连接线程接收控制权,这时准备处理

另一个命令。如果在高速缓存中没有找到目标,则由解析器根据查询类型决定如何传送控制权。

./sql/sql_parse.cc/mysql_parse()

{

         lex_start();

         mysql_reset_thd_for_next_command();

         query_cache_send_result_to_client();// >0命中直接返回

         sp_cache_flush_obsolete();// <=0

         parse_sql();

mysql_execute_command();

         |switch(lex->sql_command)

         |case: SQLCOM_SHOW…SQLCOM_SELECT

                            |check_table_access()//判断是否有访问权限

                            | execute_sqlcom_select()

                                     |handle_select

                                               |sql_select.cc/mysql_select()

                                                        |sql_select.cc/JOIN::optimize()//先进行优化操作

                                                        |JOIN::exec()

                   |…

                   |case:SQLCOM_DO

                            | mysql_do()

                   |case: SQLCOM_CREATE_TABLE

                            | mysql_create_table()

                   |case: SQLCOM_CREATE_TABLE

                            |sq_table.cc/mysql_create_table()

                   |case: SQLCOM_CREATE_INDEXSQLCOM_ALTER_TABLE

                            | sq_table.cc/ mysql_alter_table()

                   | case: SQLCOM_ANALYZESQLCOM_OPTIMIZE

                   ….

                   | case: SQLCOM_UPDATE

                            |sql_update.cc/mysql_update()

                  |case: SQLCOM_INSERT

                            | sql_insert.cc/mysql_insert()

                   |case:SQLCOM_DELETE

                            |sql_delete.cc/mysql_delete()

                   | case: SQLCOM_DROP_TABLE

                            |sql_table.cc/mysql_rm_table()

                   |case:SQLCOM_ALTER_DB

                            |sql_db.cc/ mysql_alter_db()

                   ….

update_global_user_stats();

}

可以看到解析器是MySQL的一个非常重要的模块,它包括两个基本的部分:句法扫描器和

语法规则模块。句法扫描器将整个查询分解为多个令牌(一些不可分割的元素,例如列名

称),同时语法规则模块找到一个SQL语法规则组合,该组合产生这一序列,并执行与这

些规则相关的代码。最后产生一棵解析树,以供优化器使用(优化器应该主要在查询时

使用)。然后就是选择各个处理分支,这些分支包括上面定义的:

表管理器模块、 表修改模块、 表维护模块、 状态报告模块。

 

--------------------------------------------------------------------------------------------------------------

查询高速缓存模块:

如上一个模块所解释的,该模块通过cache来提高查询的速度。该模块主要由./sql/sql_cache.cc

文件定义。由query_cache_send_result_to_client()==send_result_to_client()完成查询。

send_result_to_client()

{

         check_table_access();

         send_data_in_chunks();

}

注:该函数开头的函数注释可能是错的(

 RESULTS

    1       Query was not cached.

         0       The query was cached and user was sent the result.

         -1      The query was cached but we didn't have rights to use it.

                   No error is sent to the client yet.

)正确的可能是01对调!

-------------------------------------------------------------------------------------------------------------------------

优化器模块:

当在进行select操作的时候就会先进入该模块,它包括Query OptimizerJoin Optimizer以及

范围优化等复杂过程,现在先不进行太深入的学习,等你以后有机会再单独学习。该模块

的主要接口是sql/Sql_select.cc

---------------------------------------------------------------------------------------------------------------------------

表管理器、表修改模块、表维护模块、状态报告模块

表管理器负责创建读取和修改表定义文件(.frm扩展名)、维护表描述符高速缓存(即表高速

缓存),以及管理表锁。

表修改模块负责诸如表创建、删除、重命名、移除、更新或插入之类的操作。

表维护模块负责表维护操作,诸如检查,修理,备份,表优化,表分析等。

状态报告模块负责回答关于服务器配置设置、性能追踪变量、表结构信息、复制进度、

表高速缓存使用状况等的查询。该模块处理以SHOW开始的查询。

因为通过解析器模块上的代码流程可以很容易找到相应的模块,所以这里不再分析它们的代码流程。

--------------------------------------------------------------------------------------

另外的如日志模块、主复制服务器模块、从复制服务器模块、客户端/服务器协议API、低层次网络IO

等由于时间及使用情况,暂不进行学习。以后的学习主要会放在存储引擎上。

 

下面再附上两张图:

     图1 mysql的三层体系结构

 

该图来自网上,虽然很简单,但是清楚的看到mysql的一个整体结构,第一层可以看作与客户端

进行连接请求处理,包括网络协议,低层网络IO及客户验证等;而第二层就是负责解析、优化、

查询等业务处理;第三层也是mysql的最底层,负责数据的存储,读取,索引的建立等。现在

mysql的一个主要特性是支持插件式的存储引擎。所以可以在第二层与第三层之间再加一个抽象

存储引擎接口层,而此时下面的存储引擎就是各种不同的引擎如:myISAM、InnoDB。

                             图2 Mysql模块视图

该图来自《深入理解MySql核心技术》,该图亦是MySql各模块之间的关系,结构图。

以上内容如有出错,欢迎各位大虾指正。

抱歉!评论已关闭.