试试吧

全部免费,试试吧致力于打造领先的一站式在线工具平台!

加载中...

MySQL8 内存管理

MySQL8 内存管理,MySQL8教程,介绍 MySQL8 内存管理和配置示例等。

全栈教程https://try8.cn/article

  MySQL8 内存管理
最近更新:2023-04-17

一、MySQL8 内存管理介绍

MySQL8 内存管理主要分为两部分,一部分是全局级别使用的,主要由服务层管理常驻内存,另一部分是线程级的,只有使用的时候才分配。MySQL8 默认配置需要 512MB 左右的内存,您可以通过设置系统变量来优化性能。


1.1、内存开销

MySQL8 影响较大的内存开销,在理论上可以简单计算为:全局共享内存 + 最大连接数 * 线程独享内存。当然还有一部分是因为系统进行内存分配、以及可能的内存碎片占用等开销。


二、MySQL8 全局共享内存

全局共享内存如:key_buffer_size,innodb_buffer_pool_size,innodb_log_buffer_size,thread_cache_size 等。


2.1、key_buffer_size

密钥(键)缓存大小,它决定索引处理的速度,尤其是索引读的速度,key_buffer_size 对 MyISAM 表起作用,您可以增加该值以获得更好的索引来处理数据,官方推荐设置为服务器总内存的25%,一般不能超过50%。


取值计算公式:

  • 主要用于读取:Key_reads / Key_read_requests 比率通常应小于 0.01;
  • 主要用于删改:Key_writes / Key_write_requests 比率通常接近 1。


查看默认值与取值计算公式:

# 查看 key_buffer_size 默认值
select @@key_buffer_size/1024/1024 as 'key_buffer_size(MB)'
# 取值计算公式相关参数
show status like 'key_read%';
show status like 'key_write%';


2.2、innodb_buffer_pool_size

Innodb 缓存池大小,作为 Innodb 存储引擎影响性能最大的参数之一,innodb_buffer_pool_size 主要用于指定内存的大小来缓存数据和索引。官方推荐设置为服务器总内存的 80%,一般为系统预留一些可以适当缩小。


查看默认值:

# 查看 innodb_buffer_pool_size 默认值
select @@innodb_buffer_pool_size/1024/1024 as 'key_buffer_size(MB)'


2.3、innodb_log_buffer_size

Innodb 日志缓存大小,主要用来存储日志数据的缓存大小,适当增加此数值可以有效提升磁盘 IO 效率。


查看默认值:

# 查看 innodb_log_buffer_size 默认值
select @@innodb_log_buffer_size/1024/1024 as 'key_buffer_size(MB)'


2.4、thread_cache_size

线程缓存大小,表示服务器应该缓存多少线程以供使用。当客户端断连时,如果客户端线程数量少于此参数值,则将断开的线程放入缓存中,通过重用该线程以提高性能,thread_cache_size 取值范围 0-16384,-1表示自动调整大小。


三、MySQL8 线程独享内存

例如:read_buffer_size,read_rnd_buffer_size,sort_buffer_size,tmp_table_size,join_buffer_size,binlog_cache_size 等。


3.1、read_buffer_size

MySQL8 读取的缓存大小,用于除了 InnoDB 以外的存储引擎。在临时文件中缓存索引、批量插入和缓存嵌套结果。


3.2、read_rnd_buffer_size

MySQL8 随机读的缓存大小,当按照任意顺序读取数据时,将分配一个随机读缓存区,如果需要排序大量数据,可以适当调大该值,分配过大将导致较大的内存开销。


3.3、sort_buffer_size

MySQL8 执行排序的缓存大小,如果 order by 过慢,首先查看是否可以使用索引解决,否则适当增加该值。


3.4、tmp_table_size

MySQL8 临时表缓存大小,代表每个线程使用临时表的最大值,如果超出限制,它会自动转换为磁盘内部临时表。


3.5、join_buffer_size

MySQL8 join 连接缓存大小,在无法添加索引的时候,使用该值分配缓存可以获得更快的连接速度。


3.6、binlog_cache_size

MySQL8 二进制事务缓存大小,如果事务的数据超出了内存缓存区的空间,超出的数据将存储在一个临时文件中。因此你可以通过减少或消除写入临时文件的需要来增加此缓存大小以获得更好的性能。


四、MySQL8 内存查看示例

4.1、查看内存参数

通过 MySQL8 提供的跟缓存相关的系统变量来查看内存占用,您可以简单分析 MySQL8 内存的实际使用情况。

 select @@key_buffer_size as key_buffer_size,
	@@innodb_buffer_pool_size as innodb_buffer_pool_size,
	@@innodb_log_buffer_size as innodb_log_buffer_size,
	@@thread_cache_size as thread_cache_size,
	@@read_buffer_size as read_buffer_size,
	@@read_rnd_buffer_size as read_rnd_buffer_size,
	@@sort_buffer_size as sort_buffer_size,
	@@tmp_table_size as tmp_table_size,
	@@join_buffer_size as join_buffer_size,
	@@binlog_cache_size as binlog_cache_size;


4.2、查看内存使用

通过 MySQL8 提供的系统库表来查看内存占用,您可以多角度分类监控 MySQL8 内存的详情数据。

select * from performance_schema.memory_summary_by_account_by_event_name;
select * from performance_schema.memory_summary_by_host_by_event_name;
select * from performance_schema.memory_summary_by_thread_by_event_name;
select * from performance_schema.memory_summary_by_user_by_event_name;
select * from performance_schema.memory_summary_global_by_event_name;
select * from sys.x$memory_by_host_by_current_bytes;
select * from sys.x$memory_by_thread_by_current_bytes;
select * from sys.x$memory_by_user_by_current_bytes;
select * from sys.x$memory_global_by_current_bytes;
select * from sys.x$memory_global_total;


4.3、查看线程语句

通过 MySQL8 系统表,查看线程对应的 SQL 语句,以上参数和库表可以按需关联使用,此处仅作简单示例。

select a.thread_id, 
    a.user, 
    b.digest_text, a.current_allocated, a.total_allocated
from sys.memory_by_thread_by_current_bytes as a,
    performance_schema.events_statements_current as b
where a.thread_id = b.thread_id;


五、MySQL8 内存管理 总结

MySQL8教程 - MySQL8 内存管理,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 内存管理介绍开始,逐步到 MySQL8 内存管理示例等,通篇实用易懂,让 MySQL8 入门更加快速和简单。


《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。