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