Innodb之线程独享内存
引用链接:
https://blog.csdn.net/miyatang/article/details/54881547
https://blog.csdn.net/wyzxg/article/details/7700394?utm_source=copy https://blog.csdn.net/qq_27529917/article/details/78454947 |
线程独享内存:
线程栈信息使用内存(thread_stack)
排序使用内存(sort_buffer_size) Join操作使用内存(join_buffer_size) 顺序读取数据缓冲区使用内存(read_buffer_size) 随机读取数据缓冲区使用内存(read_rnd_buffer_size) 连接信息及返回客户端前结果集暂存使用内存(net_buffer_length) 批量插入暂存使用内存(bulk_insert_buffer_size) 临时表使用内存(tmp_table_size) 缓存二进制日志的(binlog_cache_size) |
线程内存分配总和:
All thread buffer(会话/线程级内存分配总和) =
max_threads(当前活跃连接数) * ( read_buffer_size -- 顺序读缓冲,提高顺序读效率 +read_rnd_buffer_size -- 随机读缓冲,提高随机读效率 +sort_buffer_size -- 排序缓冲,提高排序效率 +join_buffer_size -- 表连接缓冲,提高表连接效率 +binlog_cache_size -- 二进制日志缓冲,提高二进制日志写入效率 +tmp_table_size -- 内存临时表,提高临时表存储效率 +thread_stack -- 线程堆栈,暂时寄存SQL语句/存储过程 +thread_cache_size -- 线程缓存,降低多次反复打开线程开销 +net_buffer_length -- 线程持连接缓冲以及读取结果缓冲 +bulk_insert_buffer_size -- MyISAM表批量写入数据缓冲 ) |
线程独享内存的作用:
在MySQL中,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可以通过相关参数来控制内存的使用量。 |
1线程栈信息使用内存(thread_stack)
主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以过thread_stack 参数来设置为每一个线程栈分配多大的内存。
参数:thread_stack ---Global,No Dynamic,Default 192K(32bit), 256K(32bit), 推荐配置:默认 |
2排序使用内存(sort_buffer_size)
MySQL用此内存区域进行排序操作(filesort),完成客户端的排序请求。当我们设置的排序区缓存大小无法满足排序实际所需内存的时候,MySQL会将数据写入磁盘文件来完成排序。由于磁盘和内存的读写性能完全不在一个数量级,所以sort_buffer_size参数对排序操作的性能影响绝对不可小视。
可以通过查询计划中的Extra列的值为Using file-sort来证实使用了和这个缓冲区。 >explain select * from user1; 参数:sort_buffer_size -----Global Session,Dynamic,Default 2M(32bit) 推荐配置:8M(内存足够的情况下),默认(内存紧张的情况) |
3 Join操作使用内存(join_buffer_size)
应用程序经常会出现一些两表(或多表)Join的操作需求,MySQL在完成某些Join需求的时候(all/index join),为了减少参与Join的“被驱动表”的读取次数以提高性能,需要使用到Join Buffer来协助完成Join操作。。当Join Buffer太小,MySQL 不会将该Buffer存入磁盘文件,而是先将Join Buffer中的结果集与需要Join的表进行Join操作,然后清空Join Buffer中的数据,继续将剩余的结果集写入此Buffer中,如此往复。这势必会造成被驱动表需要被多次读取,成倍增加IO访问,降低效率。
什么时候会用到? 当查询必须连接两个表(或多个)的数据集并且不能使用索引时,这个缓冲区会被用到。这个缓冲区专门为每个线程的无索引链接操作准备的。 使用确认: 可以通过查询计划中的Extra列的值为Using join bufer来证实使用了和这个缓冲区。 >explain select * from user1; 参数:join_buffer_size --Global Session,Dynamic,Default 128K 各版本平台最大值不一样 |
4顺序读取数据缓冲区使用内存(read_buffer_size)
这部分内存主要用于当需要顺序读取数据的时候,如无法使用索引的情况下的全表扫描,全索引扫描等。在这种时候,MySQL按照数据的存储顺序依次读取数据块,每次读取的数据快首先会暂存在read_buffer_size中,当buffer空间被写满或者全部数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。
参数:read_buffer_size ----Global Session,Dynamic,Default 128K 推荐配置:4M/8M |
5随机读取数据缓冲区使用内存(read_rnd_buffer_size)
和顺序读取相反,当MySQL进行非顺序读取(随机读取)数据块的时候,会利用这个缓冲区暂存读取的数据。如根据索引信息读取表数据,根据排序后的结果集与表进行Join等等。总的来说,就是当数据块的读取需要满足一定的顺序的情况下,MySQL就需要产生随机读取,进而使用到read_rnd_buffer_size 参数所设置的内存缓冲区。
参数:read_rnd_buffer_size -----Global Session,Dynamic,Default 256K 推荐配置:8M |
6连接信息及返回客户端前结果集暂存使用内存(net_buffer_length)
这部分用来存放客户端连接线程的连接信息和返回客户端的结果集。当MySQL开始产生可以返回的结果集,会在通过网络返回给客户端请求线程之前,会先暂存在通过net_buffer_length所设置的缓冲区中,等满足一定大小的时候才开始向客户端发送,以提高网络传输效率。不过net_buffer_lenth参数所设置的仅仅只是该缓存区的初始化大小,MySQL会根据实际需要自行申请更多的内存以满足需求,但最大不会过max_allowed_packet参数大小。 参数:net_buffer_length ----Global Session,Dynamic,Default 16K 推荐配置:默认 16K |
当我们使用如insert … values(…),(…),(…)… 的方式进行批量插入的时候,MySQL会先将提交的数据放如一个缓存空间中,当该缓存空间被写满或者提交完所有数据之后,MySQL才会一次性将该缓存空间中的数据写入数据库并清空缓存。此外,当我们进行 LOAD DATA INFILE操作来将文本文件中的数据Load进数据库的时候,同样会使用到此缓冲区。
参数:bulk_insert_buffer_size ----Global Session,Dynamic,Default 8M 推荐配置:默认 8M |
8.临时表使用内存(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。谁小谁生效.另外还有一个参数max_tmp_tables,没有使用。
参数:tmp_table_size ---Global Session,Dynamic,Default 16M 推荐配置:64M 参数:max_heap_table_size ----Global Session,Dynamic,Default 8M 推荐配置:64M 可以通过MySQL状态变量created_tmp_tables和created_tmp_disk_tables来确定创建了临时表和基于磁盘的临时表 mysql> show global status like 'create%tables'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 0 | | Created_tmp_tables | 17 | +-------------------------+-------+ 5.5中,可以使用PERFORMANCE—SCHEMA来帮助统计基于磁盘的临时表的总大小 |
9. 二进制日志缓冲区Binlog Cache( binlog_cache_size)
二进制日志缓冲区主要用来缓存由于各种数据变更操做所产生的 binary Log 信息。为了提高系统的性能,MySQL 并不是每次都是将二进制日志直接写入 Log File,而是先将信息写入 Binlog Buffer 中,当满足某些特定的条件(如sync_binlog参数设置)之后再一次写入 Log File 中。我们可以通过 binlog_cache_size 来设置其可以使用的内存大小,同时通过 max_binlog_cache_size 限制其最大大小
参数: binlog_cache_size、max_binlog_cache_size -----Global,Dynamic,Default 32K 推荐配置:2M 查看语句:mysql> show global status like 'bin%'; Binlog_cache_disk_use表示因为我们binlog_cache_size设计的内存不足导致缓存二进制日志用到了临时文件的次数。Binlog_cache_use 表示 用binlog_cache_size缓存的次数,当对应的Binlog_cache_disk_use 值比较大的时候, 我们可以考虑适当的调高, binlog_cache_size 对应的值。 说明:当单个事务过大的时候 MySQL会申请更多的内存。当所需内存大于 max_binlog_cache_size 参数设置的时候,MySQL 会报错:“Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage”。 |
补充说明:上面所列举的MySQL线程独享内存仅仅只是所有线程独享内存中的部分,并不是全部,只是这些可能对MySQL的性能产生较大的影响,且可以通过系统参数进行调节。由于以上内存都是线程独享,极端情况下的内存总体使用量将是所有连接线程的总倍数。所以在设置过程中一定要谨慎,切不可为了提升性能就盲目的增大各参数值,避免因为内存不够而产生Out Of Memory异常或者是严重的Swap交换反而降低整体性能。
Innodb之线程独享内存的更多相关文章
- MySQL线程独享[转]
一.前言在 MySQL 中,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可以通过相关参数来控制内存的使用量。 二.线 ...
- 33.unique_ptr独享内存智能指针
#include <iostream> #include <memory> #include <string> #include <vector> us ...
- 最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁
在Java并发场景中,会涉及到各种各样的锁如公平锁,乐观锁,悲观锁等等,这篇文章介绍各种锁的分类: 公平锁/非公平锁 可重入锁 独享锁/共享锁 乐观锁/悲观锁 分段锁 自旋锁 01.乐观锁 vs 悲观 ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等
Java 中15种锁的介绍 Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等,在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类 ...
- Java 种15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁等等…
Java 中15种锁的介绍 1,在读很多并发文章中,会提及各种各样的锁,如公平锁,乐观锁,下面是对各种锁的总结归纳: 公平锁/非公平锁 可重入锁/不可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲 ...
- Java最全锁剖析:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁
乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用. 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会 ...
- 独享锁 & 共享锁
独享锁(互斥锁):同时只能有一个线程获得锁.比如,ReentrantLock 是互斥锁,ReadWriteLock 中的写锁是互斥锁. 共享锁:可以有多个线程同时获得锁.比如,Semaphore.Co ...
- 自定义AQS独占模式下的同步器来实现独享锁
自定义AQS独占模式下的同步器来实现独享锁 /** * 自定义AQS独占模式下的同步器来实现独享锁 */ public class Mutex implements Lock, java.io.Ser ...
- java线程内存模型,线程、工作内存、主内存
转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...
随机推荐
- 【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!
俄罗斯方块的核心玩法非常简单,所以制作起来并不是很复杂,我准备先用2篇文字的篇幅详细讲解一下俄罗斯方块的制作方法. 今天咱们算是第一篇,主要讲解俄罗斯方块中如何定义方块,以及如何实现方块的移动.旋转. ...
- 安装JDK及环境变量配置
1.下载JDK: 下载地址:https://www.oracle.com/technetwork/java/javase/overview/index.html 2.解压,运行安装包,下一步,选择安装 ...
- 【C++】 C++异常捕捉和处理
在阅读别人开发的项目中,也许你会经常看到了多处使用异常的代码,也许你也很少遇见使用异常处理的代码.那在什么时候该使用异常,又在什么时候不该使用异常呢?在学习完异常基本概念和语法之后,后面会有讲解. ( ...
- centos7启用EPEL Repository
1,下载库文件 http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm 2,安装 r ...
- 安卓WebSocket使用
引入jar包: implementation "org.java-websocket:Java-WebSocket:1.4.0"implementation "org.s ...
- AT3557 Four Coloring
题目链接 题解 先把每个格子看做一个点 (所谓的切比雪夫距离的转化) ,然后把这些点组成的矩形旋转45度,再把他塞到一个每个格子大小为\(d*d\)的网格图中,那么在一个格子上的点颜色相同 代码 #i ...
- STM32入门系列-STM32最小系统介绍
STM32最小系统组成 单片机最小系统,也就是能够使得单片机正常运行程序,最少需要连接哪些器件.一般来说,STM32最小系统由四部分组成: 电源电路 复位电路 晶振电路 下载电路 STM32单片机由A ...
- 应用LORAWAN技术的好处是什么
LoRaWAN现在一种非常流行的LPWA通信标准,在ISM(工业.科学.医疗)频段使用未经许可的无线电频谱,频率约为900MHz到430MHz(世界各地的标准各不相同). 物联网连接环境除了智能家庭联 ...
- Java学习的第三十六天
1.2.1 public class cjava { public static void main(String[]args) { int a,b; a='A'; b='B'; System.out ...
- net core webapi多版本控制与nswag 交互
前言 首先希望webapi 支持多版本,swagger针对不同的版本可进行交互.netcore 基于Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer 包, ...