Mysql内存使用详解及清空内存的命令

MySQL通过提供buffer和cache提高数据库的性能,我们可以通过配置文件修改参数值。

一、Mysql对于内存的使用

InnoDB buffer pool

内存中一块用来保存 表、索引、辅助buffer等对象的区域。

  • For efficiency of high-volume read operations, the buffer pool is divided into pages that can potentially hold multiple rows.
  • For efficiency of cache management, the buffer pool is implemented
    as a linked list of pages;

bufferpool的大小对INNODB影响很大,对应的参数就是innodb_buffer_pool_size。我们需要掌握以下几点:

  1. 建议设定为服务器内存总大小的50%~70%。如果同时部署其他应用应适应减小。
  2. Innodb在mysql启动的时候一次性分配整个内存给bufferpool。
  3. 如果你的服务器内存很大,可以把一个bufferpool划分成多个buffer pool instances。可以用innodb_buffer_pool_instances控制缓冲池的数量。
  4. 如果buffer pool设置过小,页数据的刷新就会非常频繁。pages数据从bufferpool刷新到磁盘时,可能造成混乱。
  5. 如果buffer pool设置过大,可能占用内存过大,到时swapping交换内存数据到磁盘。

MyISAM key buffer

所有的线程共享了keybuffer的内存,key_buffer_size参数据定了这块内存的大小。

  1. 对于每个myisam table来讲,索引(index)文件只被打开一次,而数据文件(data)每次被线程访问的时候都会打开一次。
  2. 对于每个线程,会分配一个3*最大row长度的内存供内部使用。
  3. myisam_use_mmap用来打开myisam表的内存映射功能。

线程占用的内存

  • 栈 (thread_stack)–取决于操作系统
  • 连接connection buffer (net_buffer_length)
  • 结果 buffer (net_buffer_length)
  • 最大包 max_allowed_packet
  1. 连接和结果的buffer初始值等于net_buffer_length,能够增加到的最大值就是max_allowed_packet。如果超过最大限制,就会报错。通常出现在单行数据特别大,比如包含了blog。
  2. sql查询结束后结果buffer大小就会恢复到初始值。
  3. 所有的线程使用的都是同一个内存空间。线程使用结束后,可以选择回收空间,也可以选择放入线程池,后者仍然占据内存空间。
  4. 每个线程用于计算的大小由max_digest_length参数决定。

read_buffer_size(顺序读) read_rnd_buffer_size(随机读)

a sequential scan of a table 顺序扫描一个表
reading rows in an arbitrary sequence 当随机读写表记录是

临时表和内存表

  • tmp_table_size 决定临时表最大值
  • max_heap_table_size 决定内存表最大值
  1. 如果内存表和临时表超过最大限定,就会被写入磁盘。但如果同create语句明确创建的内存表不能超过上面限制。
  2. 所有的join操作几乎在一次传递中完成,不产生临时表。大多数临时表都是基于内存的哈希表。
  3. 大所属的sort会产生临时表,临时表的数量取决表的大小

table_open_cache表缓存和table_definition_cache表定义缓存

对应了 “表文件.ibd ”和“表定义文件.frm”

  1. 所有正在使用的table都会被缓存到tabel cache。通过“First In, First Out” (FIFO).的方式管理
  2. 如果表数量特别多,可以增加table_definition_cache的大小,可以提升打开表的速度。这个缓存占用空间很小。

二、清空内存的方法

mysqladmin flush-tables命令的作用

  1. 把所有非使用的状态的表格全部关闭,并且给正在使用中的表打上标记,这些表使用关闭后也会被关闭。
  2. 当所有表都被关闭后,命令才会结束。

FLUSH PRIVILEGES

GRANT, CREATE USER, CREATE SERVER, INSTALL PLUGIN , REVOKE, DROP
USER, DROP SERVER, UNINSTALL PLUGIN
上述操作可能会产生缓存,可以通过FLUSH PRIVILEGES 释放这些缓存。

猜你喜欢

转载自blog.csdn.net/kouryoushine/article/details/89357191