
回复
• 一、讲解例子
• 二、function内存管理过程讲解
• 三、function内存管理过程图例
• 四、总结
一、讲解例子
MySQL的存储过程在运行过程中的内存管理跟table等运行时候是不一样的,它涉及多层内存管理,在开发时候如果不注意内存管理很容易造成内存泄露。接下来我用以下function的例子来说明,procedure的也是类似的,只是少了return result的过程。
function语句示例:
二、function内存管理过程讲解
1、在debug模式下查看function的code。可以看到一共分了3个步骤实现。
2、return result内存管理
gdb跟踪return result的代码:
3、执行function的内存管理
执行function的内存管理相关代码,sp_head::execute_function函数:
4、内存释放
以上产生的内存块call_arena释放的代码
三、function内存管理过程图例
上面的过程总结如图所示,每个阶段内存产生的数据包括item和field都应该使用对应的arena,即thd->swap_query_arena来管理内存,这样才不会造成数据管理错乱,数据丢失等问题。procedure的内存管理也是一样的,只是少了return result相关的处理过程。
四、总结
MySQL存储过程的内存管理过程很精妙,代码中会出现多次的thd->swap_query_arena来进行内存切换,必须严格区分哪些数据应该放在对应的那个arena,才能正确管理sp数据。
Enjoy GreatSQL :)
文章转载自公众号:GreatSQL社区