MySQL将内存用在了哪里

本片文章参考官网讲述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     |
+---------------------------+---------------+

原文地址:https://www.cnblogs.com/Bccd/p/8496435.html

时间: 2024-08-05 08:44:06

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

mysql大内存高性能优化方案

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

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

首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分): 复制代码 代码如下: per_thread_buffers=(read_buffer_size+read_rnd_buffer_size+sort_buffer_size+thread_stack+join_buffer_size+binlog_cache_size+tmp_table_size)*max_connectionsglobal_buffers=innodb_buffer_

MySQL InnoDB内存压力判断以及存在的疑问

本文出处:http://www.cnblogs.com/wy123/p/7259866.html(保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 与其他数据一样,内存对数据库的性能有着至关重要的影响,MySQL InnoDB也一样通过内存来缓存数据,在访问数据的时候通过访问内存中缓存的数据来提高数据的访问效率.MySQL中通过show variables like 'Innodb_buffer_pool%'命令或者直接

MYSQL使用内存计算

MySQL内存占用计算: global buffer+all thread buffer global buffer= innodb_buffer_pool_size 缓存表数据和索引数据,加速查询,并且使查询结果集保存在内以供重用,一般设置到主机内存的70%以下 +innodb_additional_mem_pool_size 存放数据字典信息以及一些内部数据结构,如果数据库的对象过多的话,该值可能需要调整,一般不做调整 +innodb_log_buffer_size 事务日志所使用的缓冲区,

mysql服务器内存使用情况总结

活动链接(动态)使用的内存数量如下所示: per_connection_memory = read_buffer_size //memory for sequential table scans +read_rnd_buffer_size // memory for buffering reads +sort_buffer_size // memory ofr in mem sorts +thread_stack //per connection memory +join_buffer_size

linux设置虚拟内存(swap)解决mysql因内存不足挂掉的故障

mysql错误日志显示: InnoDB: mmap(137363456 bytes) failed; errno 122016-03-01 01:38:42 13064 [ERROR] InnoDB: Cannot allocate memory for the buffer pool2016-03-01 01:38:42 13064 [ERROR] Plugin 'InnoDB' init function returned error.2016-03-01 01:38:42 13064 [E

MySQL占用内存过大的问题解决

MySQL竟然变化这么大了,记忆里还是40MB左右的软件. 现在去官网下载都300多MB了……oracle在干啥呢…… 安装完以后一启动,内存直接告警. 打开任务管理器一看,mysqld.exe竟然占用内存400多MB,我的Eclipse才300多MB…… 好吧,找到了原因,为了数据库本身的较好的性能,在启动的时候预先“霸占”了大量的内存. 根据百度的结果,可以通过修改MySQL的配置文件对它进行优化. ① my.ini文件在哪里? 如果是像我一样windows下默认安装的,可以在C:\Prog

MySql 小内存优化

MySql5.6启动内存近500M,如在小型机内存敏感的环境可能较大,下边配置会减少较多内存,至150M以下. performance_schema = OFF innodb_buffer_pool_size = 8M innodb_additional_mem_pool_size = 1M innodb_log_buffer_size = 1M key_buffer_size = 0 query_cache_size = 0 注: [PERFORMANCE_SCHEMA]:MySQL 5.5新

c代码连接mysql数据库内存泄露的问题

一直使用C代码连接mysql数据库,今天用valgrind检测,发现存在内存泄露的问题 代码如下 MYSQL* connection; connection = mysql_init(); connection = mysql_real_connect(connection,......); mysql_query(.........); mysql_close(connection); 在网上查了一番,找到如下解决方案 http://pipal.iteye.com/blog/903506 在m