mysql内存使用

mysql内存使用统计:

MySQL分配缓冲区和缓存以提高数据库操作的性能。默认配置是大约512MB RAM的虚拟机上启动。可以通过增加某些缓存和缓冲区相关系统变量的值来提高MySQL性能。还可以修改默认配置以在内存有限的系统上运行MySQL。

以下列举了MySQL的内存使用方法:

1、缓冲池

InnoDB缓冲池是保持缓存的InnoDB表,索引,及其它辅助缓冲中的数据。为了提高大容量读取操作的效率,缓冲池被分成多个实例可以容纳更多的行。为了提高缓存管理的效率,缓冲池使用LRU算法的变体 。

  1. InnoDB使用malloc()函数在服务器启动时为整个缓冲池分配内存,由innodb_buffer_pool_size变量控制;
  2. 在大容量内存的系统上,可以通过将缓冲池划分为多个缓冲池实例来提高并发性 。innodb_buffer_pool_instances 系统变量定义缓冲池实例的数量;
  3. 过小的缓冲池可能会导致过多的数据交换;
  4. 过大的缓冲池可能会因内存竞争而导致交换;

2、MyISAM

  1. 所有线程共享MyISAM 缓冲区。由 key_buffer_size系统变量决定大小;
  2. 对于打开的每个MyISAM表,索引文件打开一次;
  3. 为访问该表的每个并发运行的线程打开一次数据文件;
  4. 每个并发线程,分配表结构,每列的列结构和大小的缓冲区,相当于表数据大小;
  5. 每个连接3*n的缓冲区(n为行长度,row_length),blob列需要额外5到8个字节加上blob数据的长度;
  6. myisam_use_mmap默认为关闭,可以设置为1,使能对所有内存映射MyISAM表;

3、内存表

  1. 每个线程分配一次tmp_table_size,增长程度由 max_heap_table_size变量决定,超过后产生硬盘临时表,引擎由internal_tmp_disk_storage_engine决定;
  2. 显式创建的MEMORY引擎表,由 max_heap_table_size变量控制增长程度;

4、performance_schema模式

  1. performance_schema模式监控mysql内存使用情况,以递增方式动态分配内存。分配内存后,在重新启动服务器之前不会释放内存;

5、线程分配

每个并发线程,都会分配一些空间,可能会分配多次:

  1. thread_stack
  2. 连接缓冲区 net_buffer_length
  3. 结果缓冲区 net_buffer_length
    连接缓冲区和结果缓冲区的大小都等于net_buffer_length字节大小,max_allowed_packet根据需要动态放大到 字节
  4. max_digest_length
  5. read_buffer_size
  6. read_rnd_buffer_size
  7. sort_buffer_size
  8. join_buffer_size
    当不再需要线程时,分配给它的内存被释放并返回给系统,除非线程返回到线程缓存中。在这种情况下,内存仍然是分配的。

6、共享内存

所有线程共享相同的基本内存。

7、BLOB列

  1. 对于每个具有BLOB 列的表,动态放大缓冲区以读取更大的BLOB值。如果扫描表,缓冲区会增大到 BLOB最大值。
  2. 所有连接都是一次执行,大多数连接都可以在不使用临时表的情况下完成。大多数临时表都是基于内存的哈希表。包含BLOB列的临时表存储在磁盘上。

8、表缓存

MySQL需要表缓存的内存和描述符。所有正在使用的表的处理程序结构都保存在表缓存中,并作为“ 先进先出 ”(FIFO)进行管理。
table_open_cache变量定义缓存大小。
table_definition_cache变量定义表的定义。如果使用大表,则可以创建大型表定义来加速打开速度。
FLUSH TABLES语句关闭所有未同时使用的表,并将所有正在使用的表标记为在当前执行线程完成时关闭,这可以有效释放内存占用。

9、其他

mysql服务器缓存了GRANT, CREATE USER, CREATE SERVER,和 INSTALL PLUGIN语句,需要使用FLUSH PRIVILEGES释放。

mysql的内存使用可以在performance_schema库下找到以memory开头的表:

  1. memory_summary_by_account_by_event_name:
    以账户形式显示内存使用。
  2. memory_summary_by_host_by_event_name
    以host形式显示内存使用。
  3. memory_summary_by_thread_by_event_name
    以线程形式显示内存使用
  4. memory_summary_by_user_by_event_name
    以用户形式显示内存使用
  5. memory_summary_global_by_event_name
    显示全局内存使用

或者在sys库下,查找memory相关表,这些表更清晰的提供了内存使用。

你可能感兴趣的:(Linux,mysql)