本片文章参考官网讲述MySQL是如何分配内部内存,同时涉及到如何合适设的置内存分配以及如何监控内存的使用情况

官方文档

MySQL在启动时默认被分配给512MB RAM,可以通过设置相关内存参数对其进行设置,下面时MySQL使用内存的地方

1、InnoDB buffer pool 用于缓存表数据、索引及其他的一些辅助缓冲池,为了高效进行缓存管理,buffer pool 应用多种LRU(least recently used)算法,将相邻的page串成链,管理冷热数据

  • innodb_buffer_pool_size控制buffer pool的大小,MySQL5.7开始,可以在线变更配置
  • 为了提高并行,可以将buffer pool分成多个实例,默认如果buffer pool的大小达到1GB,instance的个数时8,可以通过innodb_buffer_pool_instances配置

2、所有的线程共享MyISAM key buffer ,受key_buffer_size参数控制

每打开一个MyISAM表,索引文件只会打开一次,当多个线程并行打开同一个表时,此表只会被打开一次,但是单个线程内,表结构、列结构及3*N(N是最长行的大小,不包括blob列)的缓存都会被分配内存。BLOB列需要5到8个bytes加上BLOB数据。MyISAM存储引擎额外分配一个row buffer 用于内部

3、内部的内存临时表如果超过设置大小则转为磁盘表,控制内存临时表的大小参数有tmp_table_sizemax_heap_table_size,on-disk临时表的存储引擎受internal_tmp_disk_storage_engine设置

4、performance schema根据服务器的实际负载自增分配内存,已分配的内存只有在MySQL重启时才会释放

5、为每个客户端线程分配线程所需的内存,包括

connection buffer 和result buffer 最初的大小是 net_buffer_length bytes, 但是根据需要可以动态的扩大到 max_allowed_packet bytes 。 result buffer 收缩到 net_buffer_length bytes 当执行每个sql 后. 当语句正在执行中,当前statement的文本的副本也会被缓存。每个连接线程使用内存计算语句的摘要,服务器为每个会话分配max_digest_length bytes

6、所有线程共享共同的基础系统内存

7、当线程不再被使用时,为其分配的内存将被回收并重新归为系统,除非使用长连接,线程回到缓冲池,对其分配的内存不会释放

8、顺序读表被分配一个read buffer ,受read_buffer_size控制

9、随机读取行数据会被分配random-read buffer ,受read_rnd_buffer_size控制

10、所有连接都在一次执行中执行,大多数连接都可以在不使用临时表的情况下完成。

11、大多数的排序会占用一个sort buffer和0到2个临时文件(根据结果集的大小而定)

12、几乎所有的解析和计算都是在线程本地和可重用的内存池中完成的。

13、对于每个含有BLOB列的表,会占用一个自动扩大的buffer用于读入更大的BLOB值,如果进行全表扫描,这个buffer会扩大到和最大的BLOB值一样大

14、MySQL的table cache需要内存和描述符,所有使用中的表结构的处理程序都缓存在table cache中,管理原则时先进先出(FIFO),table cache受table_open_cache控制

MySQL同样需要内存缓存表结构文件,受table_definition_cache控制,不需要描述符,可以增大table definition cache来加快表的打开速度

15、flush tables 命令会关闭所有不使用的表并标记当前正在使用的表在调用他们的线程结束后被关闭。会有效的释放内存,flush tables在表都关闭后才会返回

16、MySQL会缓存权限、server、插件相关的命令文本,只有执行flush privileges后才会释放内存

监控MySQL的使用情况

查看innodb相关的内存监控是否开启,默认不开启

mysql> SELECT * FROM performance_schema.setup_instruments
WHERE NAME LIKE '%memory/innodb%';
+-------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+-------------------------------------------+---------+-------+
| memory/innodb/adaptive hash index | NO | NO |
| memory/innodb/buf_buf_pool | NO | NO |
| memory/innodb/dict_stats_bg_recalc_pool_t | NO | NO |
| memory/innodb/dict_stats_index_map_t | NO | NO |
| memory/innodb/dict_stats_n_diff_on_level | NO | NO |
| memory/innodb/other | NO | NO |
| memory/innodb/row_log_buf | NO | NO |
| memory/innodb/row_merge_sort | NO | NO |
| memory/innodb/std | NO | NO |
| memory/innodb/trx_sys_t::rw_trx_ids | NO | NO |
...

设置开启所有的memory instruments ,配置文件条件如下并重启

performance-schema-instrument='memory/%=COUNTED'

查看监控数据

mysql> SELECT * FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME LIKE 'memory/innodb/buf_buf_pool'\G
EVENT_NAME: memory/innodb/buf_buf_pool
COUNT_ALLOC: 1
COUNT_FREE: 0
SUM_NUMBER_OF_BYTES_ALLOC: 137428992
SUM_NUMBER_OF_BYTES_FREE: 0
LOW_COUNT_USED: 0
CURRENT_COUNT_USED: 1
HIGH_COUNT_USED: 1
LOW_NUMBER_OF_BYTES_USED: 0
CURRENT_NUMBER_OF_BYTES_USED: 137428992
HIGH_NUMBER_OF_BYTES_USED: 137428992

通过sys库查看当前server分配的所有内存

mysql> SELECT * FROM sys.memory_global_by_current_bytes
WHERE event_name LIKE 'memory/innodb/buf_buf_pool'\G
*************************** 1. row ***************************
event_name: memory/innodb/buf_buf_pool
current_count: 1
current_alloc: 131.06 MiB
current_avg_alloc: 131.06 MiB
high_count: 1
high_alloc: 131.06 MiB
high_avg_alloc: 131.06 MiB
# 细化查询每个code area 分配的内存
mysql> SELECT SUBSTRING_INDEX(event_name,'/',2) AS
code_area, sys.format_bytes(SUM(current_alloc))
AS current_alloc
FROM sys.x$memory_global_by_current_bytes
GROUP BY SUBSTRING_INDEX(event_name,'/',2)
ORDER BY SUM(current_alloc) DESC;
+---------------------------+---------------+
| code_area | current_alloc |
+---------------------------+---------------+
| memory/innodb | 843.24 MiB |
| memory/performance_schema | 81.29 MiB |
| memory/mysys | 8.20 MiB |
| memory/sql | 2.47 MiB |
| memory/memory | 174.01 KiB |
| memory/myisam | 46.53 KiB |
| memory/blackhole | 512 bytes |
| memory/federated | 512 bytes |
| memory/csv | 512 bytes |
| memory/vio | 496 bytes |
+---------------------------+---------------+

MySQL将内存用在了哪里的更多相关文章

  1. MySQL中内存分为全局内存和线程内存

    首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分): 复制代码 代码如下: per_thread_buffers=(read_buffer_s ...

  2. mysql大内存高性能优化方案

    mysql优化是一个相对来说比较重要的事情了,特别像对mysql读写比较多的网站就显得非常重要了,下面我们来介绍mysql大内存高性能优化方案 8G内存下MySQL的优化 按照下面的设置试试看:key ...

  3. 计算MySQL的内存峰值公式 (转)

    -- 计算MySQL的内存峰值公式,计算所有的连接满了的情况下: select (@@key_buffer_size + @@query_cache_size + @@tmp_table_size   ...

  4. 计算MySQL的内存峰值公式

      -- 计算MySQL的内存峰值公式,计算所有的连接满了的情况下:select (@@key_buffer_size + @@query_cache_size + @@tmp_table_size  ...

  5. mysql中内存的使用与分配

    mysql的内存分配,是调优的重中之重,所以必须搞清楚内存是怎么分配的 mysql> show global variables like '%buffer%'; +-------------- ...

  6. mysql之内存表

    一.引言 昨天下午老大让我查资料看一下mysql的内存表在主从备份中是否能被复制,我还没听说过内存表呢,于是上网查资料,记录一下,以便查阅.学习 二.进展 参考: http://www.cnblogs ...

  7. 计算MySQL的内存峰值公式 (转)

    -- 计算MySQL的内存峰值公式,计算所有的连接满了的情况下: select (@@key_buffer_size + @@query_cache_size + @@tmp_table_size   ...

  8. Mysql占用内存过高的优化过程

    一.环境说明: 操作系统:CentOS 6.5 x86_64 数据库:Mysql 5.6.22 服务器:阿里云VPS,32G Mem,0 swap 二.问题情况: 1.某日发现公司线上系统的Mysql ...

  9. MySQL的内存表(转)

    说明:MySQL内存表可以提升一些临时业务的查询,比如做Session的共享,一些类似缓存的数据等. “内存表”顾名思义创建在内存中的表,真是这样吗?其实不然,MySQL的内存表,表结构创建在磁盘上, ...

随机推荐

  1. Android商城开发系列(九)—— 首页频道布局的实现

    在上一篇博客当中,我们讲了关于首页轮询广告的实现,接下来讲解一下首页频道布局的实现,如下图所示: 这个布局用的是gridview去完成的,新建一个channel_item,代码如下所示: <?x ...

  2. Android商城开发系列(五)—— 商城首页回到顶部和搜索框布局实现

    今天我们来开发商城的首页[输入搜索框]布局和点击右下角图片回到顶部的效果 搜索功能在App中很常见,尤其是在商城类的项目当中,一般都会提供很强大的搜索功能,App的搜索布局一般都是在App的顶部,如下 ...

  3. 首次将项目从eclipse提交到服务器的SVN

    1.在Eclipse项目中,点击需要提交到svn的项目,鼠标右键,如下图: 2.鼠标右键后,我们看到Team选项,在二级菜单中点击“Share Project”,这个时候弹出“Share Projec ...

  4. (四)SpringMVC之使用cookie实现记住密码的功能

    注意:因为实现记住密码的功能需要用到json,所以需要加上这条语句: <script type="text/javascript" src="scripts/jqu ...

  5. Unity中实现全局管理类的几种方式

    (搬运自我在SegmentFault的博客) 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合 ...

  6. python_96_类的继承1

    #面向对象3大特性:封装,多态,继承 # 继承可节省内存,减少代码 class People(): def __init__(self,name,age): self.Name=name self.A ...

  7. BigDecimal and double

    BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数 ...

  8. 【数论分块】bzoj2956: 模积和

    数论分块并不精通……第一次调了一个多小时才搞到60pts:因为不会处理i==j的情况,只能枚举了…… Description $\sum_{i=1}^{n}\sum_{j=1 \land i \not ...

  9. 【AC自动机】bzoj4327: JSOI2012 玄武密码

    题目思路没话讲:主要是做题时候的细节和经验 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中 ...

  10. skimage学习(一)

    skimage即是Scikit-Image.基于python脚本语言开发的数字图片处理包 skimage包由许多的子模块组成,各个子模块提供不同的功能.主要子模块列表如下: data子模块学习 导入d ...