
首先,感谢大家 7 月 30 号晚 8:00 准时与我们线上见。
国庆老师直播概要中提到:MySQL 数据库的内存管理比较复杂,但又是最核心的
部分。从直播的参与度与现场提问及结束后的留言可以看出,大家对这次分享的
主题十分感兴趣,其重要性可见一斑。 时间问题,很多参与直播的朋友表示意
犹未尽,在这里,小编就将直播的回放视频&PPT 如数安排上,另有额外干货加
持!
MySQL 内存管理
接下来分几个部分,将国庆老师本次直播的干货整理成文字跟大家一起分享
提示: 下面的内容大家结合 PPT/视频阅更加清晰明了
1. MySQL 内存的分类,我们是按照内存使用的层次来划分的哈,大家都知道
MySQL 分为 Server 层和引擎层。因为这两部分都有内存使用,而且是分开管理
的。所以我们也是按照这个进行分类;
2. 一条 sql 语句的内存使用,我们以 delete 为例,来介绍它从发送给 mysql 到执
行结束,mysql 内存的分配,使用和释放;
3. Mem_root 介绍,Server 层内存管理结构,后续会详细介绍;
4. 大 sql 的内存使用,这个也是为啥会有本次分享的原因,我们热璞是分布式数
据库,我的备份工具也是对存储节点进行备份,当还原时,会将备份的数据应逻
辑备份的方式,为了备份效率,我们会将数据平成一个大 sql,还原的时候直接
执行这个大 sql,已实现数据还原,比如 insert into table() values(),()...等等,然后
MySQL 内存就爆了,这一部分呢,将会详细介绍一条 sql 在不同的阶段使用了哪
些内存;
5. 一个很神奇的问题,free 的内存并没有还给操作系统哦,但是 mysql 已经显式
的做了 free 了,那 free 的内存到底去了哪里呢?
4&5 页
我们先看第一部分,MySQL 内存的分类。我们知道 MySQL 中内存的种类很多,
sort buffer, join buffer,query_chache, table_cache, innodb_buffer_pool_size
等。
同时,如前面介绍的,MySQL 是分层的,分为 Server 层以及 engine 层,在 Server
层,MySQL 使用 mem_root 进行管理,在 engine 层,就用大家熟悉的 buffer pool
来进行管理了。
如 图 , mem_root 如 果 包 括 init_alloc_root , alloc_root , reset_root_defaults,
free_alloc 这些函数,用于申请,分配,和回收内存。对内存的使用和释放最终
会落到 OS 层的 malloc 和 free 函数。
评论