本人打算从SQL语句的执行开始学习和分析MYSQL源码,首先了解MYSQL是如何执行一条SQL语句的,详细了解它的执行过程之后,再深入学习执行一条SQL语句的运行原理。
1)从执行一条SQL语句的堆栈中查看MYSQL的执行过程
假设数据库"wlz"中存在表T1(create table t1(c1 int,c2 int);),并插入了两条数据(1,3),(2,4);可以使用show tables;查看当前数据库中存在哪些表;
执行SQL语句 select * from t1;
堆栈如下:
pthread_start-》handle_one_connection-》do_handle_one_connect-》do_command-》dispatch_command
从这个堆栈过程可以看出,执行一条SQL语句是通过一个线程来执行,也就是说一个会话使用一个线程来控制(可能表达有点误区),而SQL真正的开始分析执行的入口函数为dispatch_command
进入dispatch_command的函数后,因为上述SQL语句的类型为“COM_QUERY”,所以进入该分支;而处理SQL语句的函数主要是mysql_parse函数;
mysql_parse函数首先进行分析parse_sql(),然后进行执行mysql_execute_command();即(parse_sql-》mysql_execute_command)
执行函数mysql_execute_command()中执行语句的类型为SQLCOM_SELECT,
然后调用执行函数execute_sqlcom_select-》handle_select-》mysql_select,最终所有的处理都是在mysql_select函数中运行;
mysql_select函数中重要的三部分分别为prepare(准备)、optimize(SQL语句优化,即优化器)、exec(物理执行)。
2)从调试跟踪一条SQL语句的执行过程可以发现,在mysql中执行一条SQL语句,mysql的处理主要在于两个函数,其中一个是
mysql_parse,这个函数模块是把执行一条SQL语句分成了两部分,一部分为分析SQL语句,parse_sql函数的主要功能,第二个部分是执
行SQL语句,mysql_execute_command函数完成的功能,两者结合起来,一起完成一条SQL语句从分析到真正执行的全过程,也就是一般
教科书中提到的“词法解析-》语法解析-》逻辑计划-》查询优化-》物理执行计划“,parse_sql主要完成两面两步,词法和语法部分,后者完成后面
的三步;另一个函数是mysql_select,完成了计划的生成到执行步骤,也是mysql执行一条SQL语句的关键技术;对上述讲述,语法部分也可能
在mysql_select函数中的prepare中,因为暂时未阅读代码,但一般理解,应该是在parse_sql阶段。
3)小结
今天主要是大致调试跟踪了MYSQL执行一条SQL语句的整体过程,从词法分析到最终的物理执行计划的一个流水式学习过程,这样一来就大致了解了MYSQL的执行SQL语句的操作是怎么样的,接下来的工作是了解具体的解析过程和分析过程,包括里面涉及的步骤或算法。
PS:明天开始,阅读词法与语法解析部分,主要是语法解析部分,词法部分主要是了解MYSQL把一条SQL语句怎样划分,划分成什么样,相对来讲,
较简单点,而语法主要是查看MYSQL处理词法解析后的结构,把握每一部分的处理过程,如:如何处理order
by,子查询等,这里可能就涉及到对整个MYSQL的一个框架问题,所以需要花稍微长的时间来阅读和学习。