MySQL源码:MYSQL存储过程和函数的分析原理及缓存机制.docVIP

MySQL源码:MYSQL存储过程和函数的分析原理及缓存机制.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MySQL源码:MYSQL存储过程/函数的分析原理及缓存机制 前言:我个人认为,有关MYSQL存储过程/函数在MYSQL中的实现比较粗糙,可扩展性不够好,其实现的耦合性太高,所以主要讲一些它的原理方面的内容,但有可能在某些方面理解不够好或者有些不正确的地方,欢迎指正,谢谢! 在MYSQL中,同样有很多类型的系统对象,包括表、视图、存储过程、存储函数等,但由于MYSQL的插件式存储引擎及其它实现方面的特点,其每一种对象的缓存方式都不同,或者说这些对象的缓存不是通过一种统一的方式来管理的,每一种对象的缓存都是有自己的特点,并且缓存的内容也有很大的差异,下面再叙述一下存储过程(PLSQL)缓存方式。 MYSQL数据库管理系统中的存储过程/函数也是有缓存机制的,存储过程/函数实际上是用户通过创建存储过程的语句创建好的系统对象,它具有指定的名字、类型(存储过程/函数)及要执行的语句序列等。例如下面就是一个创建过程的语句: create procedure p() begin declare a int default 100; declare b int default 1000; declare d int default 1000; begin declare c varchar(100) default hello world; insert into my values(a, c); end; end; 上面创建的过程名字为p,下面定义了一些变量并且都赋了初始值,一对BEGIN及END标志了一个语句块的内容,语句块可以嵌套定义,比如上面就在第一对BEGIN及END之间又定义了一对BEGIN及END,每一个语句块中又可以单独定义自己的变量,同时这些变量又有自己的可见性范围,假设在内层语句块中定义了一个变量,在外层同时又定义了一个同名的变量,那么在内层引用这个变量时实际上是内层定义的变量,而这个变量在外层是不可见的,可以引用到的只能是外层定义的变量。 在实现上(基于源代码的分析),一个存储过程/函数分析后会得到一个sp_head结构体对象,这个对象唯一对应一个存储过程,而每一个语句块对应一个sp_pcontext结构对象,这个对象之间存在着父子关系,一个父亲可以有多个孩子,一个孩子只能有一个父亲,比如上面例子中的存储过程语句,整体的存储过程P就对应一个sp_head结构体对象,第一个BEGIN对应的语句块是父sp_pcontext,而其中又包括了一个语句块,这个语句块是父语句块的一个子语句块,在分析之后同样会生成一个sp_pcontext对象,它是一个子语句块对象,sp_pcontext结构体内有一个成员m_parent,它会指向父语句块,实际上这个语句块可以被称为一个“上下文环境”,因为它是可以被看作像C语言中的一个语句块,比如用{}括起来的一段代码一样。 在进行语法分析sp_compile时,MYSQL会对每一条分析的语句都生成相应的指令,这些指令都被顺序存储到类型为DYNAMIC_ARRAY的动态数组m_instr中,这是用来存储所有的这个存储过程的指令的,比如对于上面语句“declare b int default 1000;”,系统首先会分配一个变量的存储空间,变量被放在sp_pcontext对象中,也是通过一个动态数组m_vars来存储的,因为变量是语句块级的,而上面这条语句还对应的一个操作就是给这个变量赋初始值,所以系统要创建一个指令给这个变量设置初值,这个指令为sp_instr_set,每一个指令都需要实现一个执行函数exec_core,这个函数是一个虚函数,每一种指令的执行都要实现自己的执行函数,就比如上面这个设置变量的指令,它的实现是调用了函数set_variable来给指定的变量设置指定的初始值即可。 对于不同的操作,有不同的指令,MYSQL包括的指令有:sp_instr_stmt(执行SQL语句的指令)、sp_instr_set(设置变量的指令)、sp_instr_set_trigger_field(设置触发器中涉及到NEW/OLD变量的值的指令)、sp_instr_jump、sp_instr_jump_if_not(执行跳转指令)、sp_instr_freturn(函数返回指令)、sp_instr_cpush(游标声明指令)、sp_instr_copen(打开游标的指令)、sp_instr_cclose(关闭游标的指令)、sp_instr_cfetch(从游标取数据的指令)等,在PLSQL中涉及到这些操作后,都会创建相应的指令,并加入到sp_head的指令动态数组中,执行时会通过顺序或者跳转的方式执行。 在PLSQL中,本人最感兴趣的是变量的引用,包括本地变量及上层语句块的变量的引用,系统是如何正确的找到相

文档评论(0)

feiyang66 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档