MySQL 内存相关参数说明

数据库关系型数据库技术服务知识库
前言

内存指标是 RDS for MySQL 最重要的指标之一,不合理的参数配置,待优化的 SQL 可能导致内存利用率持续升高,严重时会导致实例 OOM,进而导致主从切换。 本文从参数的角度分析 MySQL 内存的组成部分。

session 级别独享内存

session 级别的独享内存是分配给每个连接私有的内存,执行如下命令,可以看到独享内存的分配情况

show variables where variable_name in ('thread_stack', 'read_buffer_size','read_rnd_buffer_size','sort_buffer_size','join_buffer_size','binlog_cache_size','tmp_table_siz
e','net_buffer_length','bulk_insert_buffer_size' );
```
`
查询结果如下:
````undefined
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| binlog_cache_size       | 32768    |
| bulk_insert_buffer_size | 4194304  |
| join_buffer_size        | 262144   |
| net_buffer_length       | 16384    |
| read_buffer_size        | 262144   |
| read_rnd_buffer_size    | 262144   |
| sort_buffer_size        | 262144   |
| thread_stack            | 262144   |
| tmp_table_size          | 16777216 |
+-------------------------+----------+
9 rows in set (0.00 sec)
```
`
参数说明如下:

1. **binlog_cache_size**:一个事务在未 commit 之前会将 binlog 日志缓存到 binlog cache,然后在事务 commit 之后通过 binlog 的刷盘策略进行持久化。
2. **bulk_insert_buffer_size**:是针对 MyISAM 表进行 bulk 插入操作时的优化手段。
3. **join_buffer_size**:join buffer 用于优化多表 join 的场景,目的是将非驱动表加载到 join buffer 中来加速数据查找效率。
4. **read_buffer_size & read_rnd_buffer_size**:主要是针对顺序和随机扫描的优化手段,当线程在进行随机/顺序扫描时会先扫描这两块内存区域来避免更多的物理读。这两个参数主要针对 MyISAM 表。
5. **sort_buffer_size**:sort buffer 主要用于 order by 和 group by 操作,用来存储排序的中间结果。在排序过程中,如果存储量大于 sort_buffer_size,则会在磁盘生成临时表以完成操作。
6. **tmp_table_size**:该参数用于指定使用临时内存表的大小,如果连接创建的临时表超过此限制,会转化为磁盘上的临时表。
7. **net_buffer_length**:用于指定客户端缓存结果集的大小。
8. **thread_stack**:用于存放客户端请求的 query 以及自身状态信息的内存堆栈信息。

# 全局共享内存
全局共享内存为所有连接所共享。执行如下命令,可以看到共享内存的分配情况:
````undefined
mysql> show variables where variable_name in ( 'innodb_buffer_pool_size','innodb_log_buffer_size','innodb_additional_mem_pool_size','key_buffer_size','query_cache_size' );
```
`
查询结果如下:
````undefined
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| innodb_buffer_pool_size | 4294967296 |
| innodb_log_buffer_size  | 16777216   |
| key_buffer_size         | 8388608    |
| query_cache_size        | 0          |
+-------------------------+------------+
4 rows in set (0.00 sec)
```
`
参数说明如下:

1. **innodb_buffer_pool_size**:buffer pool 是 MySQL 中最终要的缓存。其中会存储数据页,undo 页,索引页 以及一些字典信息。对数据的读写操作,首先会对 buffer pool 进行相应的操作,然后才会与存储引擎层进行交互。buffer pool 的存在主要是平衡 CPU 与磁盘之间的性能鸿沟。
2. **innodb_log_buffer_size**:innodb log buffer 主要存储 redo log,然后会以一定的条件对 log buffer 中的内容进行落盘。
3. **key_buffer_size**:key buffer 主要存储 MyISAM 存储引擎的 index block。
4. **query_cache_size**:query cache 将查询结果进行缓存,以此来减少解析 SQL 和执行的时间。query cache 在 MySQL 8.0 中已经废弃。

**如果您有其他问题,欢迎您联系火山引擎**[技术支持服务](https://console.volcengine.com/ticket/createTicketV2/)

46
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论