- 浏览: 195057 次
- 性别:
- 来自: 杭州
博客专栏
-
Percolator与分布...
浏览量:5674
文章分类
最新评论
-
heglase:
好牛逼 竟然解决了我别的问题
使用jdk工具tools.jar引发的问题 -
wqcva:
在使用这个类的时候workerId应该怎么传
java时间有序id生成 -
沙漠绿树:
增加虚拟节点解决数据均衡的问题。我有个疑问:1.使用虚拟节点后 ...
一致性hash的实现 -
BucketLi:
wangjian95 写道tddl.....?不是
java唯一ID生成 -
wangjian95:
tddl.....?
java唯一ID生成
原文地址:http://software.intel.com/zh-cn/blogs/2010/09/01/mysql1/
经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改。本文将对MySQL的整体架构及重要目录进行讲述。
1.源码结构(MySQL-5.5.0-m2)
BUILD: 内含在各个平台、各种编译器下进行编译的脚本。如compile-pentium-debug表示在pentium架构上进行编译的脚本。
Client: 客户端工具,如mysql, mysqladmin之类。
Cmd-line-utils: readline, libedit工具。
Config: 给aclocal使用的配置文件。
Dbug: 提供一些调试用的宏定义。
Extra: 提供innochecksum,resolveip等额外的小工具。
Include: 包含的头文件
Libmysql: 库文件,生产libmysqlclient.so。
Libmysql_r: 线程安全的库文件,生成libmysqlclient_r.so。
Libservices: 5.5.0中新加的目录,实现了打印功能。
Man: 手册页。
Mysql-test: mysqld的测试工具一套。
Mysys: 为跨平台计,MySQL自己实现了一套常用的数据结构和算法,如string, hash等。
Netware: 在netware平台上进行编译时需要的工具和库。
Plugin: mysql以插件形式实现的部分功能。
Pstack: 异步栈追踪工具。
Regex: 正则表达式工具。
Scripts: 提供脚本工具,如mysql_install_db等
Sql: mysql主要代码,将会生成mysqld文件。
Sql-bench: 一些评测代码。
Sql-common: 存放部分服务器端和客户端都会用到的代码。
Storage: 存储引擎所在目录,如myisam, innodb, ndb等。
Strings: string库。
Support-files: my.cnf示例配置文件。
Tests: 测试文件所在目录。
Unittest: 单元测试。
Vio: virtual io系统,是对network io的封装。
Win: 给windows平台提供的编译环境。
Zip: zip库工具
2.主要数据结构
THD 线程描述符(sql/sql_class.h)
包含处理用户请求时需要的相关数据,每个连接会有一个线程来处理,在一些高层函数中,此数据结构常被当作第一个参数传递。
NET 网络连接描述符(sql/mysql_com.h)
网络连接描述符,对内部数据包进行了封装,是client和server之间的通信协议。
TABLE 数据库表描述符(sql/table.h)
数据库表描述符,分成TABLE和TABLE_SHARE两部分。
FIELD 字段描述符(sql/field.h)
域描述符,是各种字段的抽象基类
Utility API Calls 各种API
各种核心的工具,例如内存分配,字符串操作或文件管理。标准C库中的函数只使用了很少一部分,C++中的函数基本没用。
Preprocessor Macros 处理器宏
Mysql中使用了大量的C预编译,随编译参数的不同最终代码也不同。
3.主要调用流程
(1)MySQL启动
主要代码在sql/mysqld.cc中,精简后的代码如下:
(2).监听接收链接
主要代码在sql/mysqld.cc中,精简后的代码如下:
(3).预处理连接
(4).处理
do_command在sql/sql_parse.cc中:读取客户端传递的命令并分发。
当客户端链接上mysql服务端时,系统为其分配一个链接描述符thd,用以描述客户端的所有信息,将作为参数在各个模块之间传递。一个典型的客户端查询在MySQL的主要模块之间的调用关系如下图所示:
当mysql启动完毕后,调用handle_connection_sockets等待客户端连接。当客户端连接上服务器时,服务处理函数将接受连接,会为其创建链接线程,并进行认证。如认证通过,每个连接线程将会被分配到一个线程描述符thd,可能是新创建的,也可能是从cached_thread线程池中复用的。该描述符包含了客户端输入的所有信息,如查询语句等。服务器端会层层解析命令,根据命令类型的不同,转到相应的sql执行函数,进而给传递给下层的存储引擎模块,处理磁盘上的数据库文件,最后将结果返回。执行完毕后thd将被加入cached_thread中。
经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改。本文将对MySQL的整体架构及重要目录进行讲述。
1.源码结构(MySQL-5.5.0-m2)
BUILD: 内含在各个平台、各种编译器下进行编译的脚本。如compile-pentium-debug表示在pentium架构上进行编译的脚本。
Client: 客户端工具,如mysql, mysqladmin之类。
Cmd-line-utils: readline, libedit工具。
Config: 给aclocal使用的配置文件。
Dbug: 提供一些调试用的宏定义。
Extra: 提供innochecksum,resolveip等额外的小工具。
Include: 包含的头文件
Libmysql: 库文件,生产libmysqlclient.so。
Libmysql_r: 线程安全的库文件,生成libmysqlclient_r.so。
Libservices: 5.5.0中新加的目录,实现了打印功能。
Man: 手册页。
Mysql-test: mysqld的测试工具一套。
Mysys: 为跨平台计,MySQL自己实现了一套常用的数据结构和算法,如string, hash等。
Netware: 在netware平台上进行编译时需要的工具和库。
Plugin: mysql以插件形式实现的部分功能。
Pstack: 异步栈追踪工具。
Regex: 正则表达式工具。
Scripts: 提供脚本工具,如mysql_install_db等
Sql: mysql主要代码,将会生成mysqld文件。
Sql-bench: 一些评测代码。
Sql-common: 存放部分服务器端和客户端都会用到的代码。
Storage: 存储引擎所在目录,如myisam, innodb, ndb等。
Strings: string库。
Support-files: my.cnf示例配置文件。
Tests: 测试文件所在目录。
Unittest: 单元测试。
Vio: virtual io系统,是对network io的封装。
Win: 给windows平台提供的编译环境。
Zip: zip库工具
2.主要数据结构
THD 线程描述符(sql/sql_class.h)
包含处理用户请求时需要的相关数据,每个连接会有一个线程来处理,在一些高层函数中,此数据结构常被当作第一个参数传递。
NET net; // 客户连接描述符 Protocol *protocol; // 当前的协议 Protocol_text protocol_text; // 普通协议 Protocol_binary protocol_binary; // 二进制协议 HASH user_vars; //用户变量的hash值 String packet; // 网络IO时所用的缓存 String convert_buffer; // 字符集转换所用的缓存 struct sockaddr_in remote; //客户端socket地址 THR_LOCK_INFO lock_info; // 当前线程的锁信息 THR_LOCK_OWNER main_lock_id; // 在旧版的查询中使用 THR_LOCK_OWNER *lock_id; //若非main_lock_id, 指向游标的lock_id pthread_mutex_t LOCK_thd_data; //thd的mutex锁,保护THD数据(thd->query, thd->query_length)不会被其余线程访问到。 Statement_map stmt_map; //prepared statements和stored routines 会被重复利用 int insert(THD *thd, Statement *statement); // statement的hash容器 class Statement:: LEX_STRING name; /* prepared statements的名字 */ LEX *lex; //语法树描述符 bool set_db(const char *new_db, size_t new_db_len) void set_query(char *query_arg, uint32 query_length_arg) { pthread_mutex_lock(&LOCK_thd_data); set_query_inner(query_arg, query_length_arg); pthread_mutex_unlock(&LOCK_thd_data); }
NET 网络连接描述符(sql/mysql_com.h)
网络连接描述符,对内部数据包进行了封装,是client和server之间的通信协议。
Vio *vio; //底层的网络I/O socket描述符 unsigned char *buff,*buff_end,*write_pos,*read_pos; //缓存相关 unsigned long remain_in_buf,length, buf_length, where_b; unsigned long max_packet,max_packet_size; //当前值;最大值 unsigned int pkt_nr,compress_pkt_nr; //当前(未)压缩包的顺序值 my_bool compress; //是否压缩 unsigned int write_timeout, read_timeout, retry_count; //最大等待时间 unsigned int *return_status; //thd中的服务器状态 unsigned char reading_or_writing; /*1 代表读, 2 代表写, 0代表无状态 */ unsigned int last_errno; //返回给客户端的错误号 unsigned char error; /*0:执行成功 1:在协议层有逻辑错误 2:系统调用或标准库出错 3:特例,表示缓存不能装下当前这么大的包 */
TABLE 数据库表描述符(sql/table.h)
数据库表描述符,分成TABLE和TABLE_SHARE两部分。
handler *file; //指向这张表在storage engine中的handler的指针 THD *in_use; /* 使用这张表的thread号 */ Field **field; /* 指向数据域的指针*/ uchar *record[2]; /* 指向记录的指针*/ uchar *write_row_record; /* 在THD::write_row中用来做优化 */ uchar *insert_values; /* INSERT ... UPDATE语句用 */ /* 可用来直接获取表中数据而不用读取行的当前key的映射值 */ key_map covering_keys; key_map quick_keys, merge_keys; key_map keys_in_use_for_query; /* 可用以生成GROUP BY结果的key映射值 */ key_map keys_in_use_for_group_by; /* 可用以生成ORDER BY 结果的key映射值 */ key_map keys_in_use_for_order_by; KEY *key_info; /* 数据库中key的信息*/ HASH name_hash; //数据域名字的hash值 MEM_ROOT mem_root; //内存块 LEX_STRING db; LEX_STRING table_name; LEX_STRING table_cache_key; enum db_type db_type //当前表的storage engine类型 enum row_type row_type //当前记录是定长还是变长 uint primary_key; uint next_number_index; //自动增长key的值 bool is_view ; bool crashed;
FIELD 字段描述符(sql/field.h)
域描述符,是各种字段的抽象基类
uchar *ptr; // 记录中数据域的位置 uchar *null_ptr; // 记录 null_bit 位置的byte TABLE *table; // 指向表的指针 TABLE *orig_table; // 指向原表的指针 const char **table_name, *field_name; LEX_STRING comment; /* 数据域是下列key的一部分 */ key_map key_start, part_of_key, part_of_key_not_clustered; key_map part_of_sortkey; /*各种数据域的类型*/ enum utype { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL, CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD, BIT_FIELD, TIMESTAMP_OLD_FIELD, CAPITALIZE, BLOB_FIELD, TIMESTAMP_DN_FIELD, TIMESTAMP_UN_FIELD, TIMESTAMP_DNUN_FIELD}; ….. virtual int store(const char *to, uint length,CHARSET_INFO *cs)=0; inline String *val_str(String *str) { return val_str(str, str); }
Utility API Calls 各种API
各种核心的工具,例如内存分配,字符串操作或文件管理。标准C库中的函数只使用了很少一部分,C++中的函数基本没用。
void *my_malloc(size_t size, myf my_flags) //对malloc的封装 size_t my_write(File Filedes, const uchar *Buffer, size_t Count, myf MyFlags) //对write的封装
Preprocessor Macros 处理器宏
Mysql中使用了大量的C预编译,随编译参数的不同最终代码也不同。
#define max(a, b)((a) > (b) ? (a) : (b)) //得出两数中的大者 do { char compile_time_assert[(X) ? 1 : -1] __attribute__ ((unused)); } while(0) //使用gcc的attribute属性指导编译器行为 •Global variables 全局变量 •configuration settings •server status information •various data structures shared among threads //主要包括一些全局的设置,服务器信息和部分线程间共享的数据结构。 struct system_status_var global_status_var; //全局的状态信息 struct system_variables global_system_variables; //全局系统变量
3.主要调用流程
(1)MySQL启动
主要代码在sql/mysqld.cc中,精简后的代码如下:
int main(int argc, char **argv) //标准入口函数 MY_INIT(argv[0]); //调用mysys/My_init.c->my_init(),初始化mysql内部的系统库 logger.init_base(); //初始化日志功能 init_common_variables(MYSQL_CONFIG_NAME,argc, argv, load_default_groups) //调用load_defaults(conf_file_name, groups, &argc, &argv),读取配置信息 user_info= check_user(mysqld_user);//检测启动时的用户选项 set_user(mysqld_user, user_info);//设置以该用户运行 init_server_components();//初始化内部的一些组件,如table_cache, query_cache等。 network_init();//初始化网络模块,创建socket监听 start_signal_handler();// 创建pid文件 mysql_rm_tmp_tables() || acl_init(opt_noacl)//删除tmp_table并初始化数据库级别的权限。 init_status_vars(); // 初始化mysql中的status变量 start_handle_manager();//创建manager线程 handle_connections_sockets();//主要处理函数,处理新的连接并创建新的线程处理之
(2).监听接收链接
主要代码在sql/mysqld.cc中,精简后的代码如下:
THD *thd; FD_SET(ip_sock,&clientFDs); //客户端socket while (!abort_loop){ readFDs=clientFDs; if (select((int) max_used_connection,&readFDs,0,0,0) error && net->vio != 0 && !(thd->killed == THD::KILL_CONNECTION)){ if(do_command(thd)) //处理客户端发出的命令 break; } end_connection(thd); }
(3).预处理连接
thread_count++;//增加当前连接的线程 thread_scheduler.add_connection(thd); for (;;) { lex_start(thd); login_connection(thd); // 认证 prepare_new_connection_state(thd); //初始化thd描述符 while(!net->error && net->vio != 0 && !(thd->killed == THD::KILL_CONNECTION)){ if(do_command(thd)) //处理客户端发出的命令 break; } end_connection(thd); }
(4).处理
do_command在sql/sql_parse.cc中:读取客户端传递的命令并分发。
NET *net= &thd->net; packet_length= my_net_read(net); packet= (char*) net->read_pos; command= (enum enum_server_command) (uchar) packet[0]; //从net结构中获取命令 dispatch_command(command, thd, packet+1, (uint) (packet_length-1));//分发命令在dispatch_command函数中,根据命令的类型进行分发。 thd->command=command; switch( command ) { case COM_INIT_DB: ...; case COM_TABLE_DUMP: ...; case COM_CHANGE_USER: ...; …. case COM_QUERY: //如果是查询语句 { alloc_query(thd, packet, packet_length)//thd->set_query(query, packet_length); mysql_parse(thd, thd->query(), thd->query_length(), &end_of_stmt);// 解析查询语句 …. } //在mysql_parse函数中 lex_start(thd); if (query_cache_send_result_to_client(thd, (char*) inBuf, length) sql_command 在mysql_execute_command中,根据命令类型,转到相应的执行函数。 switch (lex->sql_command) { LEX *lex= thd->lex; TABLE_LIST *all_tables; case SQLCOM_SELECT: check_table_access(thd, lex->exchange ? SELECT_ACL | FILE_ACL : SELECT_ACL, all_tables, UINT_MAX, FALSE); //检查用户权限 execute_sqlcom_select(thd, all_tables); //执行select命令 break; case SQLCOM_INSERT: res= insert_precheck(thd, all_tables) //rights mysql_insert(thd, all_tables, lex->field_list, lex->many_values,lex->update_list, lex->value_list,lex->duplicates, lex->ignore); break; ... } //在execute_sqlcom_select函数中 res= open_and_lock_tables(thd, all_tables)//directly and indirectly res= handle_select(thd, lex, result, 0); //handle_select在sql_select.cc中,调用mysql_select ,在mysql_select中 join->prepare();//Prepare of whole select (including sub queries in future). join->optimize();//global select optimisation. join->exec(); //在mysql_insert函数中 open_and_lock_tables(thd, table_list) mysql_prepare_insert(); //prepare item in INSERT statment while ((values= its++)) write_record(thd, table ,&info);//写入新的数据 //在write_record函数中, table->file->ha_write_row(table->record[0]) ha_write_row在Handler.cc中,只是一个接口 write_row(buf); //调用表存储所用的引擎
当客户端链接上mysql服务端时,系统为其分配一个链接描述符thd,用以描述客户端的所有信息,将作为参数在各个模块之间传递。一个典型的客户端查询在MySQL的主要模块之间的调用关系如下图所示:
当mysql启动完毕后,调用handle_connection_sockets等待客户端连接。当客户端连接上服务器时,服务处理函数将接受连接,会为其创建链接线程,并进行认证。如认证通过,每个连接线程将会被分配到一个线程描述符thd,可能是新创建的,也可能是从cached_thread线程池中复用的。该描述符包含了客户端输入的所有信息,如查询语句等。服务器端会层层解析命令,根据命令类型的不同,转到相应的sql执行函数,进而给传递给下层的存储引擎模块,处理磁盘上的数据库文件,最后将结果返回。执行完毕后thd将被加入cached_thread中。
发表评论
-
Mac 下在 xcode 中 debug MySQL 8.0
2019-05-16 20:28 895专业 MySQL 内核开发选手一般会选用 linux gdb ... -
MySQL 8.0 root密码忘了怎么办
2019-05-16 20:02 1725普通账号密码忘了,可以通过 root 账号重置,但是如果 ro ... -
MySQL 8.0 histogram statistics
2018-12-10 12:00 760原文: https://mysqlserverteam.com ... -
mysql 5.7默认root密码重设
2017-10-23 12:36 4781. mysql.server stop 2. xxx/mys ... -
SQL
2017-09-05 17:01 0SELECT [DISTINCT] ... -
MySQL5.Xbinlog简略格式
2016-08-11 23:32 413每种event的详细情况参见 http://dev.mysql ... -
mysqldump命令batch insert分段
2016-08-03 23:05 1112默认mysqldump命令会将指定库的某个表数据变成一整个ba ... -
分布式数据库推广文章系列
2016-01-04 11:30 0http://www.csdn.net/article/201 ... -
事务文章
2015-12-31 21:57 0http://my.oschina.net/huangyong ... -
一些文章
2015-09-04 14:38 0http://www.biaodianfu.com/herme ... -
Innodb中的锁机制(转)
2012-08-31 10:20 1015原文地址:http://www.mysqlops.com/20 ... -
Innodb中的锁机制
2012-05-20 21:27 0基本概念 - 锁的基本类型 A. 共享锁(Shared L ... -
MySQL源码分析(6):Innodb文件格式及压缩配置
2012-02-04 19:41 3362Innodb文件格式及压缩配置 Innodb文件格式代表了数据 ... -
MySQL源码分析(5):Innodb缓存系统(转)
2012-02-04 19:40 2229原文地址:http://software.in ... -
MySQL源码分析(4):InnoDB主要数据结构及调用流程(转)
2012-02-03 18:29 2365原文地址:http://software.intel.com/ ... -
MySQL源码分析(3):配置文件详解(转)
2012-02-03 18:28 1351原文地址:http://software.in ... -
MySQL源码分析(2):Mysql中的内存分配相关(转)
2012-02-03 18:24 1454原文地址:http://software.in ... -
MySQL源码分析(0):编译安装及调试(转)
2012-02-03 18:23 1712原文地址:http://software.intel.com/ ... -
C&C++入门学习-automake使用
2012-01-12 14:42 1824这两天一直在捣腾C&C++在linux上的工程编译和打 ... -
mysql以及tdhsocket插件安装tips(不要发布)
2012-01-09 14:46 0配置mysql CFLAGS="-O0 -g&quo ...
相关推荐
MySQL源码分析代码结构与基本流程完美版资料是MySQL源码分析的详细资料,涵盖了MySQL的基本架构、源码目录结构、核心类库与函数、主要模块、数据流等方面的知识点。 MySQL基本架构 MySQL的基本架构主要包括以下几...
5. **索引优化**:源码分析可以帮助我们理解B-Tree、Hash、Full-Text等不同类型的索引是如何工作的,以及如何创建和使用索引以提升查询速度。 6. **复制与高可用性**:MySQL的主从复制功能在8.1.0版本中可能会有...
五、源码分析 对于提供的"oa"压缩包文件,可能包含了以下部分: - 系统框架文件:如index.php、config.php等,用于系统初始化和配置。 - 数据库文件:如sql导入脚本,用于创建和初始化MySQL数据库。 - 控制器...
3. **数据访问层**:ADO.NET是C#与数据库交互的主要工具,通过连接字符串、SQL语句执行、数据适配器和数据集等,实现对MySQL数据库的数据操作。 其次,MySQL是一个流行的关系型数据库管理系统,具有开源、免费、高...
总之,这个“eclipse rcp excel表转mysql程序”项目结合了Eclipse RCP的桌面应用开发能力、Apache POI的Excel处理功能以及JDBC的数据库操作,实现了从Excel数据到MySQL数据库的自动化转换。开发者可以通过学习和理解...
本压缩包“易语言源码易语言mysql数据应用源码.rar”提供了易语言与MySQL数据库交互的应用示例源代码,帮助开发者了解如何在易语言中实现数据库操作。 MySQL是一款流行的关系型数据库管理系统,广泛应用于网站开发...
总结来说,这个基于SSM+MySQL的网络投票系统项目源码是一个典型的Java Web应用实例,涵盖了从前端到后端、从数据持久化到业务逻辑处理的完整流程,对于学习SSM框架和Web开发有很好的实践价值。通过分析和运行该项目...
在深入研究源码时,建议读者先熟悉PHP和MySQL的基本概念,然后逐个模块进行分析,理解每个部分的功能和实现方式。同时,对前端技术和数据库设计的理解也是必不可少的。这样,不仅可以掌握一个实际的项目,还能提升...
在“易语言源码易语言MYSQL简化版管理程序.rar”这个压缩包中,我们主要关注的是一个用易语言编写的MySQL数据库管理程序的简化版本。这个程序可能包含了与数据库交互的基本功能,如连接、查询、插入、更新和删除数据...
"基于SSM+MySQL学生社团管理系统源码数据库论文" 在本文中,我们将详细介绍基于SSM+MySQL的学生社团管理系统的设计与实现。该系统是为了满足当前社团管理的实际需求,从实际工作出发,对过去的社团管理系统存在的...
毕业设计:vue+ssm+mysql汽车租赁管理系统的设计与实现(源码 + 数据库 + 说明文档) 第2章 可行性研究与需求分析 10 2.1可行性研究 10 2.1.1 前提 10 2.1.2 可行性 10 2.2功能需求分析 11 2.4数据流程分析 12 2.4.1...
MySQL数据库是世界上最流行的开源关系型数据库之一,而Excel则是Microsoft Office套件中用于数据分析和管理的电子表格工具。本源码示例展示了如何通过易语言编程,将MySQL数据库中的数据导出为Excel文件,这对于数据...
之后是系统分析,具体完成了数据流分析和数据字典;系统设计阶段主要完成了功能模块的划分、数据库的设计和系统界面设计。该阶段对各个模块的功能进行了详细设计,形成了本系统的功能模块图,在此基础上选择了合适的...
4. Flink CEP:Flink的复杂事件处理(Complex Event Processing)模块,用于识别数据流中的模式,适用于实时监控和报警等场景。 四、部署与运行 Flink支持多种部署方式,如在ECS Linux上单机部署的Standalone模式...
毕业设计:基于SSM的mysql_高校心理测评设计与分析系统(源码 + 数据库 + 说明文档) 2 需求分析 3 2.1 功能需求 3 2.2 性能需求 4 2.3 用户需求 4 3 可行性分析 4 3.1经济可行性分析 5 3.2技术可行性分析 5 3.3...
资源名字:基于SSM+mysql的仓储系统出入库模块设计与实现(源码+设计文档+部署说明+视频演示).zip 资源内容:项目全套源码+完整文档 源码说明: 全部项目源码都是经过测试校正后百分百成功运行。 基于SSM+MySQL的...
5. **源码分析**:系统源码可能包含以下部分: - 数据库连接模块:负责建立和断开与MySQL服务器的连接。 - SQL语句执行:用于执行如添加、删除、更新和查询数据等操作。 - 用户界面:使用MFC的对话框和控件构建,...
1. 商品管理:包括商品的添加、编辑、删除及查询,支持多条件检索,便于对库存商品进行有效管理。 2. 供应商管理:记录供应商的基本信息,如名称、联系方式、信用等级等,方便进行采购操作。 3. 客户管理:管理客户...