Innodb之线程独享内存

引用连接:mysql

https://blog.csdn.net/miyatang/article/details/54881547

https://blog.csdn.net/wyzxg/article/details/7700394?utm_source=copysql

https://blog.csdn.net/qq_27529917/article/details/78454947数据库

 

线程独享内存:缓存

线程栈信息使用内存(thread_stack)

排序使用内存(sort_buffer_size)网络

Join操做使用内存(join_buffer_size)性能

顺序读取数据缓冲区使用内存(read_buffer_size)ui

随机读取数据缓冲区使用内存(read_rnd_buffer_size)spa

链接信息及返回客户端前结果集暂存使用内存(net_buffer_length).net

批量插入暂存使用内存(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

 

7. 批量插入暂存使用内存(bulk_insert_buffer_size)
当咱们使用如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_tablescreated_tmp_disk_tables来肯定建立了临时表和基于磁盘的临时表

mysql> show global status like 'create%tables';

+-------------------------+-------+

| Variable_name           | Value |

+-------------------------+-------+

| Created_tmp_disk_tables | 0     |

| Created_tmp_tables      | 17    |

 

+-------------------------+-------+

5.5中,可使用PERFORMANCESCHEMA来帮助统计基于磁盘的临时表的总大小

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交换反而下降总体性能。

相关文章
相关标签/搜索