MySQL
MySQL高可用配置
MySQL Slave状态参数详解
基于二进制日志文件的复制
使用全局事务标识符GTID复制
MySQL安装升级
MySQL RPM包安装参考
MySQL编译化安装参考
MySQL Server版本升级
MySQL 操作手册/说明
MySQL导入导出操作
库,表,字段的字符集修改方法
根据字段生成自定义SQL语句
MySQL查询流程概述
MySQL 常用脚本
MySQL数据库冷备脚本
MySQL内存占用分析
MySQL内存消耗分析
检查MySQL引起的高内存占用
InnoDB下的内存分析和优化计算
MySQL常见问题
MySQL告警:Aborted connection日志的分析
MySQL使用命令kill进程后出现killed死锁问题
从库重起初始化relaylog失败
安全插件Connection-Control导致无法登录的问题
MySQL性能优化
MySQL查询慢性能分析
本文档使用 MrDoc 发布
-
+
home page
MySQL内存占用分析
高性能MySQL数据库服务器的关键因素之一是具有良好的内存分配和利用率,尤其是在生产环境中运行时。但是如何确定MySQL利用率是否得到优化?高内存利用率是否合理,还是需要微调?如果我遇到内存泄漏怎么办? 让我们涵盖这些主题并展示您可以在MySQL中检查以确定高内存利用率的痕迹。 # MySQL中的内存分配 在深入研究特定主题之前,我将简要介绍一下 MySQL 如何使用内存。在处理并发事务和运行大查询时,内存在速度和效率方面起着重要的作用。MySQL 中的每个线程都需要用于管理客户端连接的内存,并且这些线程共享相同的基本内存。`thread_stack`(线程堆栈)、`net_buffer_length`(连接缓冲区和结果缓冲区)或`max_allowed_packet`等变量在需要时,`connection` 和 `result` 将动态扩大到该值,这些变量确实会影响内存利用率。当不再需要某个线程时,分配给它的内存将被释放并返回给系统,除非该线程返回到线程缓存中。在这种情况下,内存保持分配状态。查询连接、查询缓存、排序、表缓存、表定义在 MySQL 中确实需要内存,但这些都归因于您可以配置和设置的系统变量。 在大多数情况下,为配置设置的特定于内存的变量针对基于存储的特定配置,例如 MyISAM 或InnoDB。当mysqld实例在主机系统中生成时,MySQL 会根据在特定配置上设置的设置值分配缓冲区和缓存以提高数据库操作的性能。例如,每个 DBA 将在 InnoDB 中设置的最常见变量是变量`innodb_buffer_pool_size`和`innodb_buffer_pool_instances`,它们都与保存 InnoDB 表的缓存数据的缓冲池内存分配有关。如果您有大内存并且希望通过设置`innodb_buffer_pool_instances`来处理大事务,这是可取的通过将缓冲池划分为多个缓冲池实例来提高并发性。 而对于 MyISAM,您必须处理`key_buffer_size`来处理密钥缓冲区将处理的内存量。MyISAM 还为每个并发线程分配缓冲区,其中包含一个表结构、每列的列结构和一个大小为 3 * N 的缓冲区(其中 N 是最大行长度,不包括 BLOB 列)。MyISAM 还维护一个额外的行缓冲区供内部使用。 MySQL 也会为临时表分配内存,除非它变得太大(由`tmp_table_size` 和`max_heap_table_size`确定)。如果您正在使用 MEMORY 表并且变量`max_heap_table_size`设置得非常高,这也可能占用大量内存,因为`max_heap_table_size`系统变量决定了表可以增长多大,并且没有转换为磁盘格式。 MySQL 也有一个 Performance Schema,它是一个用于在低级别监视 MySQL 活动的功能。启用此功能后,它将以增量方式动态分配内存,将其内存使用扩展到实际的服务器负载,而不是在服务器启动期间分配所需的内存。一旦分配了内存,在服务器重新启动之前它不会被释放。 如果使用 Linux 并且内核启用了大页面支持,即使用HugePages ,MySQL 也可以配置为为其缓冲池分配大块内存。
Nathan
March 14, 2023, 7:04 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password