Настройка (и понимание) table_cache в mySQL

18

Я запустил отличный скрипт настройки производительности MySQL и начал работать с предложениями. Один, с которым я столкнулся, был

TABLE CACHE
Текущее значение table_cache = 4096 таблиц. Всего у вас 1073 таблицы. У вас есть 3900 открытых столов. Текущий рейтинг обращения к table_cache составляет 2%, в то время как 95% кэша вашей таблицы используется. Вы, вероятно, должны увеличить ваш table_cache

Я начал читать table_cache, но обнаружил, что документации по MySQL не хватает. Они говорят, чтобы увеличить table_cache, «если у вас есть память». К сожалению, table_cacheпеременная определяется как «Количество открытых таблиц для всех потоков».

Как изменится память, используемая MySQL, если я увеличу эту переменную? Что такое хорошее значение, чтобы установить его?

jotango
источник

Ответы:

16

Из документации MySQL

Например, для 200 одновременно работающих подключений размер кэша таблиц должен составлять не менее 200 × N, где N - максимальное количество таблиц на объединение в любом из выполняемых вами запросов. Вы также должны зарезервировать некоторые дополнительные файловые дескрипторы для временных таблиц и файлов.

Поэтому, если в вашем приложении есть запрос, объединяющий 4 таблицы, и вы хотите иметь возможность обрабатывать 200 одновременных подключений, на основе этого оператора у вас должен быть table_cache не менее 800.

Что касается использования памяти, у меня нет этих цифр, я подозреваю, что это будет зависеть от размера ваших таблиц, которые он кэширует.

ManiacZX
источник
Спасибо за указатель. Я немного боюсь увеличить свой номер table_cache, не зная, как изменится использование оперативной памяти. ОЗУ машины уже заполнено.
Джотанго
Вы уверены, что память фактически израсходована или только память была занята буферами / кешем? Запустите «free -m» и посмотрите на вторую строку (- / + buffers / cache), это более точное представление об использовании вашей памяти в mb. См. Ответы в serverfault.com/questions/73189/… и serverfault.com/questions/9442/…
ManiacZX
Да, это действительно использует память. Вчера он поменялся, что очень плохо для производственной базы данных. Я заказал обновление оперативной памяти от HP сегодня.
Jotango
для тех, кто придет к этому сейчас, этот ответ не является точным для MySQL 5.1+. теперь это относится к тому, table_open_cacheкогда вы смотрите на документы. Смотрите ответ @MarkRs, глядя наtable_cache
Джейсон
3

Вы должны следить за переменной Opened_Tables и видеть, насколько быстро она увеличивается. Если это значительно быстрее, чем вы создаете новые таблицы (в том числе временные), то кеш таблиц может быть слишком маленьким.

Table_Cache всегда должен - ну, в основном, в любом случае - быть значительно больше, чем общее количество таблиц на сервере. В противном случае он будет продолжать открывать и закрывать таблицы.

Я не могу понять, как вы можете получить частоту попаданий в кеш 2%, если только вы не измеряли время сразу после перезапуска сервера или много использовали FLUSH TABLES (по отношению к количеству запросов). Обычно частота обращений к кешу таблиц должна составлять 99,9%, иначе производительность будет плохой.

Не делайте FLUSH TABLES, если вы можете избежать этого, это разрушает кеш.

Открытие таблиц стоит дорого, так как нужно читать файл FRM. В MyISAM это значительно хуже (чем в других движках), так как при закрытии таблицы он также выбрасывает все блоки в кеше ключей, полученные из его индексов. Поэтому закрытие таблицы сбрасывает ее индексы из кеша ключей == не хорошо! Другие движки сохраняют кэшированные блоки, но все еще должны перечитать метаданные и выделить некоторые структуры.

MarkR
источник