mysql 5.6 内存_MySQL5.6 内存是怎么使用的?

InnoDB buffer pool ,是保存了InnoDB表、索引、其他辅助buffer的缓存数据内存块。

为了提高high-volume读的操作效率,buffer pool 被切分为 pages ,page可以保存多行数据。

为了cache管理的效率, buffer pool 使用page的链接实现;很少使用的数据不存在cache内,使用 LRU 算法。

参见 Section 14.5.1, “Buffer Pool”获取更多内容。

Buffer pool 的size 对于系统性能很重要:

InnoDB 在服务器启动的时候,通过malloc()分配整个buffer pool内存。 innodb_buffer_pool_size 系统变量定义了 buffer pool size。通常,建议 innodb_buffer_pool_size 值设置为系统内存的50%至75%。更多信息参考 Configuring InnoDB Buffer Pool Size。

对于大内存的系统,你可以通过将buffer pool 切为多 buffer pool instances来提高并发。 innodb_buffer_pool_instances 系统变量定义了buffer pool instances的数量。

Buffer pool 设置太小会导致过多的操作,因为pages从buffer pool刷新仅仅是为了稍后的再次需要。

Buffer pool 设置太大会导致因内存竞争机制发生的内存页面交换 -- swap。

所有的线程会共享 MyISAM key buffer。key_buffer_size系统变量设置它的size。

对于server打开的每个 MyISAM table ,索引文件只打开一次;对于同时访问该表的每个线程,数据文件只会打开一次。对于每个并发线程,表结构、列结构、 size = 3*N 的 buffer 会被分配(N 是最大行长度,不保含BLOB列)。BLOB 列需要在BLOB数据基础上增加 5 - 8 bytes。MyISAM 存储引擎对于内部使用还维持一个额外的row buffer。

myisam_use_mmap 系统变量设置为1,对所有MyISAM表开启memory-mapping。

如果一个内部in-memory临时表变的太大 (通过tmp_table_size和max_heap_table_size系统变量配置), MySQL会自动的将表从in-memory 转为 on-disk 格式。 On-disk 临时表使用MyISAM存储引擎。你可以提升允许的临时表size限制,参见Section 8.4.4,“Internal Temporary Table Use in MySQL”。

对于使用CREATE TABLE创建的MEMORY tables,仅max_heap_table_size系统变量定义表可以增长到多大,并且不会转为on-disk格式。

MySQL Performance Schema 是在底层监控MySQL server的一个功能。基于性能原因,在服务器启动的时候,会给Performance Schema分配固定的内存, 并且在服务器运行时不变。

服务器管理每个客户端连接的线程都需要一些thread-specific空间。如下作了清单描述以及通过哪些变量控制它们的size:

一个 connection buffer (net_buffer_length)

一个 result buffer (net_buffer_length)

connection buffer 和 result buffer 每个开始都分配 net_buffer_length bytes,但是根据需要会动态的增加到 max_allowed_packet bytes。 result buffer 会在每个SQL statement后,收缩至 net_buffer_length bytes。当一个 statement 运行时,一个当前statement string 的副本也会被分配内存。

每个连接线程都会用内存来计算 statement 摘要。在 MySQL 5.6.24 及更高版本,每个session服务器会分配 max_digest_length bytes。在 MySQL 5.6.24 之前,每个session服务器分配1024 bytes。参见Section 22.10, “Performance Schema Statement Digests”。

所有的线程共享同样的基础内存。

当一个线程不再需要,分配的内存会被释放并返回给系统,除非线程返回到了thread cache。这种情况下,内存还占着。

对表顺序扫描的每个请求都会分配一个 read buffer。read_buffer_size 系统变量定义这个 buffer size。

当以任意顺序读(比如,sort排序),会分配一个random-read buffer来避免磁盘查找。 read_rnd_buffer_size 系统变量定义这个 buffer size。

所有的 joins 都是在一个过程中执行的,并且大多的joins不需要使用临时表即可以完成。大多数临时表都是基于内存的hash表。如果临时表有很长的行 (计算所有列长度的和)或者包含 BLOB 列会被存储在磁盘上。

几乎所有的解析和计算都是在thread-local 和可重用内存池中完成的。小条目不需要内存开销,因此避免了正常内存分配和释放。内存只分配给不希望的大字符串。

对于每个拥有 BLOB 列的表,buffer 会随着读取更大的 BLOB 值而动态增长。如果你扫描一张表,这个buffer会增长到最大的 BLOB 值那么大。

MySQL table cache 需要内存和描述。所有在用表的handlers结构都保存在table cache内,并以“First In, First Out” (FIFO)的方式管理。table_open_cache 系统变量定义了初始 table cache size; 参考 Section 8.4.3.1, “How MySQL Opens and Closes Tables”。

MySQL table definition cache 也需要内存。table_definition_cache 系统变量定义了可以存在 table definition cache内的table definitions (from .frm files)数量。如果你有大量的表,你可以创建一个大的 table definition cache 来加速打开表的速度。和table cache不同,table definition cache 需要少量的空间,不需要使用文件描述。

FLUSH TABLES statement 或 mysqladmin flush-tables 命令关闭所有当前不在用的表,并且标记所有当前在用的表在当前线程结束后关闭。 这有效的释放了大多在用内存。 FLUSH TABLES 不会有任何返回直到所有表关闭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值