Почему 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

Настройте свои запросы.

Другие вопросы по тегам