mysql内存使用统计:
MySQL分配缓冲区和缓存以提高数据库操作的性能。默认配置是大约512MB RAM的虚拟机上启动。可以通过增加某些缓存和缓冲区相关系统变量的值来提高MySQL性能。还可以修改默认配置以在内存有限的系统上运行MySQL。
以下列举了MySQL的内存使用方法:
1、缓冲池
InnoDB缓冲池是保持缓存的InnoDB表,索引,及其它辅助缓冲中的数据。为了提高大容量读取操作的效率,缓冲池被分成多个实例可以容纳更多的行。为了提高缓存管理的效率,缓冲池使用LRU算法的变体 。
- InnoDB使用malloc()函数在服务器启动时为整个缓冲池分配内存,由innodb_buffer_pool_size变量控制;
- 在大容量内存的系统上,可以通过将缓冲池划分为多个缓冲池实例来提高并发性 。innodb_buffer_pool_instances 系统变量定义缓冲池实例的数量;
- 过小的缓冲池可能会导致过多的数据交换;
- 过大的缓冲池可能会因内存竞争而导致交换;
2、MyISAM
- 所有线程共享MyISAM 缓冲区。由 key_buffer_size系统变量决定大小;
- 对于打开的每个MyISAM表,索引文件打开一次;
- 为访问该表的每个并发运行的线程打开一次数据文件;
- 每个并发线程,分配表结构,每列的列结构和大小的缓冲区,相当于表数据大小;
- 每个连接3*n的缓冲区(n为行长度,row_length),blob列需要额外5到8个字节加上blob数据的长度;
- myisam_use_mmap默认为关闭,可以设置为1,使能对所有内存映射MyISAM表;
3、内存表
- 每个线程分配一次tmp_table_size,增长程度由 max_heap_table_size变量决定,超过后产生硬盘临时表,引擎由internal_tmp_disk_storage_engine决定;
- 显式创建的MEMORY引擎表,由 max_heap_table_size变量控制增长程度;
4、performance_schema模式
- performance_schema模式监控mysql内存使用情况,以递增方式动态分配内存。分配内存后,在重新启动服务器之前不会释放内存;
5、线程分配
每个并发线程,都会分配一些空间,可能会分配多次:
- thread_stack
- 连接缓冲区 net_buffer_length
- 结果缓冲区 net_buffer_length
连接缓冲区和结果缓冲区的大小都等于net_buffer_length字节大小,max_allowed_packet根据需要动态放大到 字节 - max_digest_length
- read_buffer_size
- read_rnd_buffer_size
- sort_buffer_size
- join_buffer_size
当不再需要线程时,分配给它的内存被释放并返回给系统,除非线程返回到线程缓存中。在这种情况下,内存仍然是分配的。
6、共享内存
所有线程共享相同的基本内存。
7、BLOB列
- 对于每个具有BLOB 列的表,动态放大缓冲区以读取更大的BLOB值。如果扫描表,缓冲区会增大到 BLOB最大值。
- 所有连接都是一次执行,大多数连接都可以在不使用临时表的情况下完成。大多数临时表都是基于内存的哈希表。包含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开头的表:
- memory_summary_by_account_by_event_name:
以账户形式显示内存使用。 - memory_summary_by_host_by_event_name
以host形式显示内存使用。 - memory_summary_by_thread_by_event_name
以线程形式显示内存使用 - memory_summary_by_user_by_event_name
以用户形式显示内存使用 - memory_summary_global_by_event_name
显示全局内存使用
或者在sys库下,查找memory相关表,这些表更清晰的提供了内存使用。