您的位置:首页 > 数据库 > MySQL

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

2011-03-26 20:19 537 查看
解析器:
解析器负责解析查询并生成解析树。它首先查询高速缓存看当前的查询是否是高速缓存的类型
并且存在。如果找到的话,高速缓存结果被返回给用户,连接线程接收控制权,这时准备处理
另一个命令。如果在高速缓存中没有找到目标,则由解析器根据查询类型决定如何传送控制权。
./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_INDEX、SQLCOM_ALTER_TABLE
| sq_table.cc/ mysql_alter_table()
| case: SQLCOM_ANALYZE、SQLCOM_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.
)正确的可能是0与1对调!
-------------------------------------------------------------------------------------------------------------------------
优化器模块:
当在进行select操作的时候就会先进入该模块,它包括Query Optimizer、Join Optimizer以及
范围优化等复杂过程,现在先不进行太深入的学习,等你以后有机会再单独学习。该模块
的主要接口是sql/Sql_select.cc。
---------------------------------------------------------------------------------------------------------------------------
表管理器、表修改模块、表维护模块、状态报告模块
表管理器负责创建读取和修改表定义文件(.frm扩展名)、维护表描述符高速缓存(即表高速
缓存),以及管理表锁。
表修改模块负责诸如表创建、删除、重命名、移除、更新或插入之类的操作。
表维护模块负责表维护操作,诸如检查,修理,备份,表优化,表分析等。
状态报告模块负责回答关于服务器配置设置、性能追踪变量、表结构信息、复制进度、
表高速缓存使用状况等的查询。该模块处理以SHOW开始的查询。
因为通过解析器模块上的代码流程可以很容易找到相应的模块,所以这里不再分析它们的代码流程。
--------------------------------------------------------------------------------------
另外的如日志模块、主复制服务器模块、从复制服务器模块、客户端/服务器协议API、低层次网络IO
等由于时间及使用情况,暂不进行学习。以后的学习主要会放在存储引擎上。

下面再附上两张图:



图1 mysql的三层体系结构

该图来自网上,虽然很简单,但是清楚的看到mysql的一个整体结构,第一层可以看作与客户端
进行连接请求处理,包括网络协议,低层网络IO及客户验证等;而第二层就是负责解析、优化、
查询等业务处理;第三层也是mysql的最底层,负责数据的存储,读取,索引的建立等。现在
mysql的一个主要特性是支持插件式的存储引擎。所以可以在第二层与第三层之间再加一个抽象
存储引擎接口层,而此时下面的存储引擎就是各种不同的引擎如:myISAM、InnoDB。



图2 Mysql模块视图
该图来自《深入理解MySql核心技术》,该图亦是MySql各模块之间的关系,结构图。
以上内容如有出错,欢迎各位大虾指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: