高内存使用率和使用交换

我有一个1.6GB的数据库,每个月增加大约200MB的大小。 我有一个12GB内存(共享与Apache,MySQL和操作系统),MySQL总是使用交换,我需要重新启动服务,一旦达到交换空间限制。 mysql进程的典型内存使用量为3.5GB,当我的Web服务器上有很多活动时,这个数字会增加到4.5GB。

  1. 我怎样才能避免使用交换的MySQL?
  2. 是3.5GB的mysql进程内存使用量为1.6GB的数据库大小是否正常?
  3. 我的MySQLconfiguration看起来像这样,我的configuration是否优化?
[mysqld] innodb_file_per_table datadir=/var/lib/mysql tmpdir=/var/lib/mysqltmp socket=/var/lib/mysql/mysql.sock skip-locking skip-name-resolve table_cache=3072 thread_cache_size=16 back_log=100 max_connect_errors=10000 open-files-limit=20000 interactive_timeout=30 wait_timeout=40 max_connections=100 skip-name-resolve max_allowed_packet=16M tmp_table_size=1768M max_heap_table_size=1768M query_cache_size=64M sort_buffer_size=1M read_buffer_size=1M read_rnd_buffer_size=8M join_buffer_size=32M key_buffer_size=64M myisam_sort_buffer_size=64M innodb_log_file_size=100M innodb_buffer_pool_size=1512M 

最有可能的罪魁祸首是这些设置:

 tmp_table_size=1768M max_heap_table_size=1768M 

这意味着在您的网站上查询创build的每个临时表可能需要1768 MB的内存或1.7 GB。

我会减less到64M。 这会减less内存使用量,但也可能会导致MySQL为磁盘查询写入临时表数据,这会降低速度。

如果MySQL为临时表使用大量磁盘,则需要分析应用程序并查找生成大型临时表的查询,然后重构代码以便不需要大型临时表。