Я побежал отлично Скрипт настройки производительности MySQL и начал работать над предложениями. Один, с которым я столкнулся, был
НАСТОЛЬНЫЙ КЭШ
Текущее значение table_cache = 4096 таблиц. Всего у вас 1073 таблицы. У вас 3900 открытых столов. Текущая частота попаданий table_cache составляет 2%, в то время как 95% вашего кеш-таблицы используется. Вероятно, вам следует увеличить свой table_cache
Я начал читать table_cache, но нашел Документация MySQL совсем не хватает. Говорят, чтобы увеличить table_cache
, "если есть память". К сожалению, table_cache
Переменная определяется как «Количество открытых таблиц для всех потоков».
Как изменится память, используемая MySQL, если я увеличу эту переменную? Какое значение следует устанавливать?
Например, для 200 одновременно работающих подключений у вас должен быть размер кэша таблицы не менее 200 × N, где N - максимальное количество таблиц на соединение в любом из выполняемых вами запросов. Вы также должны зарезервировать некоторые дополнительные файловые дескрипторы для временных таблиц и файлов.
Итак, если в вашем приложении есть запрос, который объединяет 4 таблицы, и вы хотите иметь возможность обрабатывать 200 одновременных подключений, на основе этого оператора у вас должно быть table_cache не менее 800.
Что касается использования памяти, у меня нет этих цифр, я подозреваю, что это будет зависеть от размера ваших таблиц, которые он кэширует.
Вы должны следить за переменной Opened_Tables и видеть, как быстро она увеличивается. Если это значительно быстрее, чем вы создаете новые таблицы (включая временные), то ваш кеш таблиц может быть слишком маленьким.
Table_Cache всегда должен - в большинстве случаев в любом случае - быть значительно больше, чем общее количество таблиц на сервере. В противном случае он будет продолжать открывать и закрывать столы.
Я не могу понять, как вы можете получить коэффициент попадания в кеш 2%, если вы не измеряли время сразу после перезапуска сервера или часто использовали FLUSH TABLES (в зависимости от количества запросов). Обычно коэффициент попадания в кеш таблицы должен составлять 99,9%, иначе производительность будет отстой.
Не выполняйте FLUSH TABLES, если вы можете этого избежать, это сдувает кеш.
Открытие таблиц обходится дорого, так как для этого нужно читать файл FRM. В MyISAM это значительно хуже (чем в других движках), так как при закрытии таблицы он также выбрасывает все блоки в ключевом кеше, полученные из его индексов. Таким образом, закрытие таблицы сбрасывает ее индексы из ключевого кеша == нехорошо! Другие движки сохраняют кешированные блоки, но им по-прежнему необходимо перечитывать метаданные и выделять некоторые структуры.