У меня есть база данных размером 1,6 ГБ, которая добавляет около 200 МБ каждый месяц. У меня 12 ГБ ОЗУ (используется совместно с apache, mysql и os), mysql всегда использует подкачку, и мне нужно перезапустить службу, как только она достигнет предела пространства подкачки. Типичное использование памяти процессом mysql составляет 3,5 ГБ и увеличивается до 4,5 ГБ при большой активности на моем веб-сервере.
[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
Это означает, что каждая отдельная временная таблица, созданная запросом на вашем веб-сайте, может занимать до 1768 мегабайт памяти или 1,7 ГБ.
Я бы уменьшил их до 64M. Это уменьшит использование памяти, но также может привести к тому, что MySQL будет записывать данные временной таблицы для запросов на диск, что замедлит работу.
Если MySQL много использует диск для временных таблиц, вам необходимо проанализировать свое приложение и выяснить, где находятся запросы, которые генерируют большие временные таблицы, а затем провести рефакторинг кода, чтобы не требовать больших временных таблиц.