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

从内存的使用方式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. java 内存 回收_java内存回收

    一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此.所以,垃圾回收是必须的. 二. ...

  2. 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明

    目录 一.相关名词解释 垃圾收集常用名词 二.哪些地方需要回收 本地方法栈.虚拟机栈.程序计数器 方法区 Java堆 三.什么时候回收 1. 内存能否被回收 内存中的引用类型 引用计数算法 可达性分析 ...

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

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

  4. java加快内存回收_java内存管理之垃圾回收及JVM调优

    GC(garbage Collector 垃圾收集器) 作用:a.内存的动态分配:b.垃圾回收 注:Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配. 一.垃圾标记 程序计数器.J ...

  5. 释放变量所指向的内存_前端基础突破(二)内存回收与内存泄漏

    垃圾回收的必要性? 在程序中,我们定义了许多变量,变量存储的在内存中,这时就需要一套机制来管理内存.在javascript中,并没有提供对应的api给开发者直接手动控制内存的申请和回收,因为javas ...

  6. mysql内存回收_mysql占用内存过多

    一.计算mysql所需的内存 https://www.cnblogs.com/cheyunhua/p/9045057.html  理论有待学习 https://www.cnblogs.com/simp ...

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

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

  8. mysql 内存调整_mySQL内存及虚拟内存优化设置

    为了装mysql环境測试,装上后发现启动后mysql占用了非常大的虚拟内存,达8百多兆. 网上搜索了一下,得到高人指点my.ini. 再也没见再具体的了..仅仅好打开my.ini逐行的啃,虽然英文差了 ...

  9. mysql内存释放_MySQL内存不释放

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 连接了一下,并进行了一次查询操作 (root:NJ-245:Thu Apr 24 16:38:38 2014)[infor ...

最新文章

  1. android p wifi一直在扫描_Android再次解读萤石云视频
  2. Android 驱动(10)----设备树(二)linux内核顶层am335x-evm.dts
  3. 刚构桥的优缺点_[中交公规院]预应力连续刚构桥总体设计及主要尺寸
  4. 11连胜!绝艺横扫中美日韩对手,称霸围棋AI世界大战
  5. Android签名打包详解
  6. 基于SSM的大学拍卖网站(含文档)
  7. 测试人员问一个功能对不对,深入分析
  8. Android下载安装Apk
  9. 大数据查询怎么优化?
  10. SpringBoot Actuator未授权访问漏洞修复
  11. obs代码总体架构图
  12. 机器视觉简介,建议学PLC和上位机的工程师看完
  13. Ubuntu14.04与Win10双系统环境的配置(引导, 无线网卡)
  14. 推荐《怪诞行为学:可预测的非理性》
  15. 武士公爵和OpenJDK的传说
  16. linux定时at,Linux定时任务之at
  17. Hosts文件位置及介绍
  18. 设计模式之略见一斑(代理模式Proxy)
  19. matlab/simulink自适应控制轮毂电机驱动的电动汽车主动悬架构型与控制
  20. 岩土工程--非线性有限元:基本理论与算法及基于Python、Fortran程序实现与案例分析

热门文章

  1. secureCrt个人操作手册
  2. 盲人计算机培训计划,中国盲人协会-河南省郑州市盲人按摩培训班教学大纲及计划...
  3. linux eclipse web插件,使用Tomcat插件开发WEB应用
  4. 以云原生的名义,举办一次技术聚会
  5. 关于虚拟内存,你需要了解的一些概念
  6. 磁盘文件整理工具,让你的电脑清清爽爽的!
  7. 天天都会写接口,但它的用途和好处有多少人能说得清楚?
  8. 2020年最新Java面试题免费下载!
  9. 你以为它挂了么?并没有!Apache Struts 2.5.22 GA 发布
  10. java 气泡_Java气泡提示功能实现