对于任何一个数据库管理系统来说,内存的分配使用绝对可以算的上是其核心之一了,所以很多希望更为深入了解某数据库管理系统的人,都会希望一窥究竟,我也不例外。

从内存的使用方式MySQL 数据库的内存使用主要分为以下两类

线程独享内存

全局共享内存

今天这篇文章暂时先分析 MySQL 中主要的 “线程独享内存” 的。

在 MySQL 中,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可以通过相关参数来控制内存的使用量。

线程栈信息使用内存(thread_stack):主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。

排序使用内存(sort_buffer_size):MySQL

用此内存区域进行排序操作(filesort),完成客户端的排序请求。当我们设置的排序区缓存大小无法满足排序实际所需内存的时候,MySQL

会将数据写入磁盘文件来完成排序。由于磁盘和内存的读写性能完全不在一个数量级,所以sort_buffer_size参数对排序操作的性能影响绝对不可

小视。排序操作的实现原理请参考:MySQL Order By 的实现分析。

Join操作使用内存(join_buffer_size):应用程序经常会出现一些两表(或多

表)Join的操作需求,MySQL在完成某些 Join 需求的时候(all/index

join),为了减少参与Join的“被驱动表”的读取次数以提高性能,需要使用到 Join Buffer 来协助完成 Join操作(具体 Join

实现算法请参考:MySQL 中的 Join 基本实现原理)。当 Join Buffer 太小,MySQL 不会将该 Buffer

存入磁盘文件,而是先将Join Buffer中的结果集与需要 Join 的表进行 Join 操作,然后清空 Join Buffer

中的数据,继续将剩余的结果集写入此 Buffer 中,如此往复。这势必会造成被驱动表需要被多次读取,成倍增加 IO 访问,降低效率。

顺序读取数据缓冲区使用内存(read_buffer_size):这部分内存主要用于当需要顺序读取数据

的时候,如无发使用索引的情况下的全表扫描,全索引扫描等。在这种时候,MySQL

按照数据的存储顺序依次读取数据块,每次读取的数据快首先会暂存在read_buffer_size中,当 buffer

空间被写满或者全部数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。

随机读取数据缓冲区使用内存(read_rnd_buffer_size):和顺序读取相对应,当

MySQL

进行非顺序读取(随机读取)数据块的时候,会利用这个缓冲区暂存读取的数据。如根据索引信息读取表数据,根据排序后的结果集与表进行Join等等。总的来

说,就是当数据块的读取需要满足一定的顺序的情况下,MySQL 就需要产生随机读取,进而使用到 read_rnd_buffer_size

参数所设置的内存缓冲区。

连接信息及返回客户端前结果集暂存使用内存(net_buffer_size):这部分用来存放客户端连接

线程的连接信息和返回客户端的结果集。当 MySQL 开始产生可以返回的结果集,会在通过网络返回给客户端请求线程之前,会先暂存在通过

net_buffer_size

所设置的缓冲区中,等满足一定大小的时候才开始向客户端发送,以提高网络传输效率。不过,net_buffer_size

参数所设置的仅仅只是该缓存区的初始化大小,MySQL 会根据实际需要自行申请更多的内存以满足需求,但最大不会超过

max_allowed_packet 参数大小。

批量插入暂存使用内存(bulk_insert_buffer_size):当我们使用如 insert …

values(…),(…),(…)… 的方式进行批量插入的时候,MySQL

会先将提交的数据放如一个缓存空间中,当该缓存空间被写满或者提交完所有数据之后,MySQL

才会一次性将该缓存空间中的数据写入数据库并清空缓存。此外,当我们进行 LOAD DATA INFILE 操作来将文本文件中的数据 Load

进数据库的时候,同样会使用到此缓冲区。

临时表使用内存(tmp_table_size):当我们进行一些特殊操作如需要使用临时表才能完成的

Order By,Group By 等等,MySQL 可能需要使用到临时表。当我们的临时表较小(小于 tmp_table_size

参数所设置的大小)的时候,MySQL 会将临时表创建成内存临时表,只有当 tmp_table_size

所设置的大小无法装下整个临时表的时候,MySQL 才会将该表创建成 MyISAM 存储引擎的表存放在磁盘上。不过,当另一个系统参数

max_heap_table_size 的大小还小于 tmp_table_size 的时候,MySQL 将使用

max_heap_table_size 参数所设置大小作为最大的内存临时表大小,而忽略 tmp_table_size 所设置的值。而且

tmp_table_size 参数从 MySQL 5.1.2 才开始有,之前一直使用 max_heap_table_size。

上面所列举的 MySQL 线程独享内存仅仅只是所有线程独享内存中的部分,并不是全部,选择的原则是可能对 MySQL 的性能产生较大的影响,且可以通过系统参数进行调节。

由于以上内存都是线程独享,极端情况下的内存总体使用量将是所有连接线程的总倍数。所以各位朋友在设置过程中一定要谨慎,切不可为了提升性能就

盲目的增大各参数值,避免因为内存不够而产生 Out Of Memory 异常或者是严重的 Swap 交换反而降低整体性能。

mysql内存工作机制_MySQL内存使用机制相关推荐

  1. mysql内存机制_MySQL内存管理机制

    1. BufferPool What is BufferPool? MySQL InnoDB Buffer Pool,MySQL InnoDB 缓冲池.里面缓存着大量数据(数据页),使 CPU 读取或 ...

  2. mysql占用内存过高_MySQL内存消耗过高问题处理

    1.环境说明 OS:RedHat 6.2 x86_64 DB:MySQL 5.6.16 服务器:Vmware ESX 虚拟机资源: 2*6C,32G Mem,6G swap 2.问题现象 MySQL内 ...

  3. mysql 写锁和读锁_mysql的封锁机制以及读锁和写锁的区别

    我们在开发中也许都有感受到,数据库的并发操作会带来许多问题,比如丢失更新.不可重复读.读脏数据(幽灵数据)等等,常见的比如自动售票系统,站点1.2同时读出剩余的票数n张,站点1售出一张票,并将n-1写 ...

  4. 纯内存linux,7、内存知识和Linux基本原则

    其实我们的操作系统也可以理解为一个虚拟机,因为他是把硬件资源虚拟成文件系统可以识别使用的程序 Linux的swap分区也相当于windows虚拟内存: 电脑三大主键: 1.CPU: time slic ...

  5. 关于mysql内存管理_MYSQL内存管理及优化

    MYSQL内存管理及优化 内存是影响数据库性能的主要资源,也是mysql性能优化的一个重要方面: 内存优化的原则 将尽量多的内存分配给mysql做缓存,但是要给操作系统和其他程序的运行预留足够的内存, ...

  6. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  7. Node的垃圾回收机制与内存溢出捕获(上)

    Node的垃圾回收机制与内存溢出捕获 一.什么是Node的内存?   想必大家在用JavaScript开发的过程中,不太关心内存的管理,因为对于前端来说,浏览器的内存几乎不会出现用完的情况,因为所接触 ...

  8. 多线程之旅之四——浅谈内存模型和用户态同步机制

     用户态下有两种同步结构的 volatile construct: 在简单数据类型上原子性的读或者写操作   interlocked construct:在简单数据类型上原子性的读和写操作 (在这里还 ...

  9. linux内存管理简介,Linux内存管理机制简介

    在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,区别于 Windows的内存管理. 主要特点是,无论物理内存有 ...

最新文章

  1. 程序员网购18年不拆快递!意外离世后满屋快递被拆开,价值3500万!
  2. 机器学习基础专题:高斯判别分析
  3. 对 makefile 中 .PRECIOUS 的学习
  4. 阿里云CDN技术 揭秘
  5. binlog2mysql,MySQL 数据恢复工具之binlog2sql
  6. tableau实战系列(三十五)-教你画个不一样的圆角条形图
  7. matlab 光谱噪声,环境小卫星高光谱影像条纹噪声去除程序IDL版
  8. 信息学奥赛一本通 2050:【例5.20】字串包含 | OpenJudge NOI 1.17 19:字符串移位包含问题
  9. Java实现智能对话机器人自动聊天+语音秒回
  10. Java API 帮助文档中英文版下载
  11. 大数据——舆情监控系统
  12. Google Earth Engine——使用climata和Python从USGS获取流数据
  13. 计算机进入bios,如何进入bios(电脑进入BIOS的两种实用方法)
  14. C语言程序设计苏小红课后习题答案7.14.5
  15. TCL65V2智能电视机质量怎么样是4K屏幕吗,不要被骗了
  16. 2023年最新前端面试题
  17. 浅谈:winform界面设计
  18. PMT函数是怎么使用的?
  19. 重要提醒,万能五笔变身超级大流氓升级超级流氓团组团静默安装!
  20. 基于Beacon技术的智慧医院解决方案

热门文章

  1. 弘辽科技:淘宝降权恢复后流量能恢复吗?怎么申诉?
  2. 实现邮箱注册账号并验证邮箱
  3. 线程池ThreadPoolExecutor的使用
  4. MySQL为什么在使用索引的情况下能够提高查询效率,不使用索引又会是什么情形
  5. 线程间通信方式Linux,线程间的通信、同步方式与进程间通信方式
  6. 二十、新人成才之路《做人七项原则 做一个正直的人》
  7. 我的学习资料分享来啦。
  8. 内存管理:程序是如何被优雅的装载到内存中
  9. 全国省市区数据-json下载
  10. jenkins基于tag构建