我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解分析MySQL8.0的内存消耗

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解分析MySQL8.0的内存消耗

  在MySQL8.0在启动的时候,会配置各种各样的buffer和cache来提高数据库的性能。如果我们在一台服务器上配置了MySQL8.0的服务,那么这台服务器的内存会同时被操作系统、MySQL8.0服务、以及其他应用程序所共享。

   生产环境中,经常会遇到内存的报警,在处理这些报警之前,你需要知道MySQL本身消耗内存最多的点在哪里,这样才能比较直观的判断出来你的MySQL服务占用的内存有多少,以及如何降低MySQL本身的内存消耗。

   在MySQL配置文件中,最常用的两个内存相关的参数是innodb_buffer_pool_size、innodb_log_buffer_size,我们来看这两个参数。

1、innodb_buffer_pool_size

这个参数定义了buffer pool的大小,大家可能都比较熟悉,buffer pool中的内容包含innodb 表、索引、以及其他的辅助buffer,buffer pool的大小对MySQL系统性能影响比较大,默认情况下,MySQL8.0配置的buffer pool大小是128MB,通常情况下,如果是单机单实例,没有其他业务,那么MySQL官方建议配置的大小为系统内存的50%到75%之间。当然,如果你的服务器上还部署了其他的应用程序,那么你需要酌情减小这个比例,从而腾出内存。

如果你的操作系统的内存很充裕,你可以设置多个innodb buffer pool实例,可以使用下面的参数来调整这个实例的个数:


mysql> show variables like '%innodb_buffer_pool_instances%';
+------------------------------+-------+
| Variable_name    | Value |
+------------------------------+-------+
| innodb_buffer_pool_instances | 1  |
+------------------------------+-------+
1 row in set (0.00 sec)

2、innodb_log_buffer_size

这个参数定义了innodb存储引擎向磁盘上写redo log之前,最多在内存中缓存数据的大小,默认是16MB。这个值增加之后,大的事务可以不用在事务提交之前将redo log落盘。如果你的update、delete和insert操作影响行数比较多,那么你需要考虑增大这个值。

重点来了:

在操作系统里面,MySQL占用的内存不仅仅是上述两个内存配置参数有关,通常情况下,我们计算MySQL占用的内存的时候,会使用下面4个值相加的方式:

1、innodb_buffer_pool_size

2、key_buffer_size  (这个参数通常是myisam表占用内存的关键参数)

3、max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) (这三个是连接级别的buffer)

4、max_connections*2MB

所以当你使用top命令看到你的MySQL占用的内存远远超过innodb_buffer_pool_size的时候,你需要考虑的另外一个关键因素是连接数是否超标了,一旦连接数过高,那么上述3、4这两部分消耗的内存将会非常多。

当然,上面列举的,是MySQL最主要占用内存的几个因素,除此之外,其他的内存消耗的地方,可以查看官方文档:

https://dev.mysql.com/doc/refman/8.0/en/memory-use.html

上述文档中,还有介绍我们如何使用performance_schema来监控MySQL的内存使用,这里我提一下整个流程,详细的细节以及参数介绍请参看官方文档。

1、查看

performance_schema.setup_instruments

这张表,找到你关注的内存变量的名称(直接搜索,结果有490多条,分为好几个大类,一定记得过滤自己关注的参数)。举个例子,我们搜索memory/innodb相关参数,代表innodb存储引擎占用的内存,结果如下:


mysql> SELECT * FROM performance_schema.setup_instruments  WHERE NAME LIKE '%memory/innodb%';
+-------------------------------------------+---------+-------+-------------------+------------+---------------+
| NAME          | ENABLED | TIMED | PROPERTIES  | VOLATILITY | DOCUMENTATION |
+-------------------------------------------+---------+-------+-------------------+------------+---------------+
| memory/innodb/adaptive hash index   | YES  | NULL |     |   0 | NULL   |
| memory/innodb/log and page archiver  | YES  | NULL |     |   0 | NULL   |
| memory/innodb/buf_buf_pool    | YES  | NULL | global_statistics |   0 | NULL   |
| memory/innodb/buf_stat_per_index_t  | YES  | NULL |     |   0 | NULL   |
| memory/innodb/clone      | YES  | NULL |     |   0 | NULL   |
| memory/innodb/dict_stats_bg_recalc_pool_t | YES  | NULL |     |   0 | NULL   |
| memory/innodb/dict_stats_index_map_t  | YES  | NULL |     |   0 | NULL   |
| memory/innodb/dict_stats_n_diff_on_level | YES  | NULL |     |   0 | NULL   |
| memory/innodb/other      | YES  | NULL |     |   0 | NULL   |
| memory/innodb/partitioning    | YES  | NULL |     |   0 | NULL   |
| memory/innodb/row_log_buf     | YES  | NULL |     |   0 | NULL   |
| memory/innodb/row_merge_sort    | YES  | NULL |     |   0 | NULL   |
| memory/innodb/std       | YES  | NULL |     |   0 | NULL   |
| memory/innodb/trx_sys_t::rw_trx_ids  | YES  | NULL |     |   0 | NULL   |
| memory/innodb/undo::Tablespaces   | YES  | NULL |     |   0 | NULL   |
| memory/innodb/ut_lock_free_hash_t   | YES  | NULL |     |   0 | NULL   |
| memory/innodb/api0api      | YES  | NULL |     |   0 | NULL   |
| memory/innodb/api0misc     | YES  | NULL |     |   0 | NULL   |
| memory/innodb/btr0btr      | YES  | NULL |     |   0 | NULL   |

2、在配置文件中写上相关的参数,开启统计,以memory/innodb/row_log_buf为例,配置文件修改的如下:


performance-schema-instrument='memory/innodb/row_log_buf=COUNTED'

3、启动实例,并在performance_schema数据库的memory_summary_global_by_event_name表中查看内存统计结果。


SELECT * FROM performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/innodb/row_log_buf'\G

当然,你还可以根据sys表中的结果,查看每个大类的聚合结果,如下:


mysql> SELECT SUBSTRING_INDEX(event_name,'/',2) AS
  code_area, 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  |
+---------------------------+---------------+

更详细的信息,请参见官方文档。

以上就是详解分析MySQL8.0的内存消耗的详细内容,更多关于MySQL8.0 内存消耗的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解分析MySQL8.0的内存消耗

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何理解代码的内存消耗么

本篇内容介绍了“如何理解代码的内存消耗么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不同语言的内存管理不同的编程语言各自的内存管理方式。C
2023-06-15

破解谜底:Go语言的形参内存消耗

go 语言中,函数参数按值传递,但指针参数例外,会修改指向的值并在调用者处反映。传递指针时,需要额外分配内存存储指针,可能导致内存消耗问题。可通过按值传递指针副本解决此问题,避免额外分配。破解谜底:详解 Go 语言形参内存消耗在 Go 语
破解谜底:Go语言的形参内存消耗
2024-04-04

android内存及内存溢出分析详解

一、Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收器来完成的。C/C+
2022-06-06

Java内存分析利器MAT的使用详解

本篇内容主要讲解“Java内存分析利器MAT的使用详解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java内存分析利器MAT的使用详解”吧!dump文件包含的内容:1,全部的对象:类,域,原生
2023-06-17

关于java中堆内存与栈内存的详细分析

一、概述在Java中,内存分为两种,一种是栈内存,另一种就是堆内存。二、堆内存1、什么是堆内存?堆内存是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。2、堆
关于java中堆内存与栈内存的详细分析
2017-04-01

详解LeakCanary分析内存泄露如何实现

这篇文章主要为大家介绍了详解LeakCanary分析内存泄露如何实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-08

详解python的内存分配机制

开始 作为一个实例,让我们创建四个变量并为其赋值:variable1 = 1 variable2 = "abc" variable3 = (1,2) variable4 = ['a',1]#打印他们的ids print('Variable1
2022-06-02

Go语言中内存管理逃逸分析详解

所谓的逃逸分析(Escape analysis)是指由编译器决定内存分配的位置吗不需要程序员指定。本文就来和大家简单分析一下Go语言中内存管理逃逸吧
2023-03-15

解析JVM内存监控流程的示例分析

解析JVM内存监控流程的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。你对JVM内存监控是否熟悉,这里向大家简单描述一下,这里是亲自测试的详细配置过程,
2023-06-17

编程热搜

目录