Почему MySQL использует так много временных таблиц?
Может ли любая ошибка конфигурации привести к созданию слишком большого количества временных таблиц, как показывает mysql..mysql тюнер
Current max_heap_table_size = 200 M
Current tmp_table_size = 200 M
Of 17158 temp tables, 30% were created on disk
table_open_cache = 125 tables
table_definition_cache = 256 tables
You have a total of 97 tables
You have 125 open tables.
Current table_cache hit rate is 3%
Ранее временная таблица была of the 23725 temp tables 38% were created on disk
но я изменился max_heap
а также tmp_table
до 200м с 16м и снизился до 30%..
engine myisam
group_concat_max_len = 32768
key_buffer_size = 3.7 GB,
thread_stack = 256k,
table_cache = 125
query_cache_limit = 1M
query_cache_size = 16M
join_buffer_size = 2.00 M
max_connections = 800
Другая система с конфигурацией по умолчанию показываетof 23725 temp tables, 1% were created on disk
Но я попытался изменить значение по умолчанию на машине с этой проблемой, и она все еще показывает Of 580 temp tables, 16% were created on disk
Я использую Ubuntu 11.4 64 бит с 48 ГБ оперативной памяти... Кто-нибудь может предложить решение?
Поможет ли это изменить механизм db с myisam на память в таблицах с помощью "group by"?
2 ответа
Временные таблицы создаются и удаляются по мере необходимости, в зависимости от выполняемых запросов. Цифра, которую вы видите, представляет собой сумму временных таблиц, созданных с момента последнего запуска MySQL, а не числа одновременно существующих.
MySQL использует временные таблицы, когда запрос не может быть рассчитан за один проход. Переключение хранилища не изменит этого. Проблема в запросе, а не в конфигурации.
Увеличение tmp_table_size
Значение только предотвратит запись некоторых из них на диск, они все равно будут созданы в памяти и заполнены данными. Эти данные, вероятно, в первую очередь поступают с диска, хотя при 48 ГБ ОЗУ вы, вероятно, достаточно много их кэшировали. Даже в кеше, так как 30% этих временных таблиц больше, чем 200 МБ, копирование этого объема данных в ОЗУ все еще занимает время.
Вы даже можете определить еще до запуска запроса, будет ли он использовать временную таблицу или нет, используя EXPLAIN
синтаксис. Просто положи EXPLAIN
перед вашим запросом, и он выведет кучу информации о плане выполнения и эффективности запроса, фактически не выполняя его.
Вероятно, вы можете найти запросы, которые вызывают эти временные таблицы, потому что они, скорее всего, будут медленными и, следовательно, попадут в ваш журнал медленных запросов.
Если вам нужна помощь в настройке конкретных запросов, DBA.SE - хорошее место.
TL; DR
Настройте свои запросы.