MySQL8 内存管理主要分为两部分,一部分是全局级别使用的,主要由服务层管理常驻内存,另一部分是线程级的,只有使用的时候才分配。MySQL8 默认配置需要 512MB 左右的内存,您可以通过设置系统变量来优化性能。
MySQL8 影响较大的内存开销,在理论上可以简单计算为:全局共享内存 + 最大连接数 * 线程独享内存。当然还有一部分是因为系统进行内存分配、以及可能的内存碎片占用等开销。
全局共享内存如:key_buffer_size,innodb_buffer_pool_size,innodb_log_buffer_size,thread_cache_size 等。
密钥(键)缓存大小,它决定索引处理的速度,尤其是索引读的速度,key_buffer_size 对 MyISAM 表起作用,您可以增加该值以获得更好的索引来处理数据,官方推荐设置为服务器总内存的25%,一般不能超过50%。
取值计算公式:
查看默认值与取值计算公式:
# 查看 key_buffer_size 默认值 select @@key_buffer_size/1024/1024 as 'key_buffer_size(MB)' # 取值计算公式相关参数 show status like 'key_read%'; show status like 'key_write%';
Innodb 缓存池大小,作为 Innodb 存储引擎影响性能最大的参数之一,innodb_buffer_pool_size 主要用于指定内存的大小来缓存数据和索引。官方推荐设置为服务器总内存的 80%,一般为系统预留一些可以适当缩小。
查看默认值:
# 查看 innodb_buffer_pool_size 默认值 select @@innodb_buffer_pool_size/1024/1024 as 'key_buffer_size(MB)'
Innodb 日志缓存大小,主要用来存储日志数据的缓存大小,适当增加此数值可以有效提升磁盘 IO 效率。
查看默认值:
# 查看 innodb_log_buffer_size 默认值 select @@innodb_log_buffer_size/1024/1024 as 'key_buffer_size(MB)'
线程缓存大小,表示服务器应该缓存多少线程以供使用。当客户端断连时,如果客户端线程数量少于此参数值,则将断开的线程放入缓存中,通过重用该线程以提高性能,thread_cache_size 取值范围 0-16384,-1表示自动调整大小。
例如:read_buffer_size,read_rnd_buffer_size,sort_buffer_size,tmp_table_size,join_buffer_size,binlog_cache_size 等。
MySQL8 读取的缓存大小,用于除了 InnoDB 以外的存储引擎。在临时文件中缓存索引、批量插入和缓存嵌套结果。
MySQL8 随机读的缓存大小,当按照任意顺序读取数据时,将分配一个随机读缓存区,如果需要排序大量数据,可以适当调大该值,分配过大将导致较大的内存开销。
MySQL8 执行排序的缓存大小,如果 order by 过慢,首先查看是否可以使用索引解决,否则适当增加该值。
MySQL8 临时表缓存大小,代表每个线程使用临时表的最大值,如果超出限制,它会自动转换为磁盘内部临时表。
MySQL8 join 连接缓存大小,在无法添加索引的时候,使用该值分配缓存可以获得更快的连接速度。
MySQL8 二进制事务缓存大小,如果事务的数据超出了内存缓存区的空间,超出的数据将存储在一个临时文件中。因此你可以通过减少或消除写入临时文件的需要来增加此缓存大小以获得更好的性能。
通过 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;
通过 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;
通过 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 内存管理,介绍 MySQL 和 MySQL8 数据库,从 MySQL8 内存管理介绍开始,逐步到 MySQL8 内存管理示例等,通篇实用易懂,让 MySQL8 入门更加快速和简单。
《MySQL8教程》主打原创、全部免费,欢迎学习和转载,如需交流请加微信号:try8_cn。