Почему я продолжаю получать Преобразование HEAP в MyISAM на моем сервере MySQL - PullRequest
5 голосов
/ 25 июня 2010

У нас периодически возникали проблемы с нашим сервером MySQL. Он продолжает выбрасывать множество этих запросов одновременно (таким образом, складывая их в моем списке процессов). Мы используем базу данных MyISAM и пул соединений через Glassfish v3 для приложения Grails.

db_user myhost: 35143 дБ, запрос 39

converting HEAP to MyISAM /* mysql-connector-java-5.1.7 ( Revision: ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect'

Мы предполагаем, что есть временные таблицы, создаваемые через GORM (grails ORM), которые вызывают эти запросы. Почему я продолжаю получать Преобразование HEAP в MyISAM на моем сервере MySQL?

1 Ответ

6 голосов
/ 26 июня 2010

О сообщении converting HEAP to MyISAM следующий ответ пишет:

Это происходит, когда временные таблицы, созданные MySQL на промежуточных этапах обработки запроса, становятся слишком большимихраниться в памяти.Насколько я знаю, при этом MySQL записывает временные таблицы MyISAM независимо от того, какой механизм БД вы используете (это всего лишь временная таблица, которая будет удалена в конце запроса).Это не проблема, за исключением времени, которое занимает процесс.

Самое простое решение - увеличить tmp_table_size, может быть временно, если вы выполняете работы по обслуживанию.Если этого недостаточно, разделите на части ваш запрос, используя LIMIT и OFFSET, и увеличьте OFFSET, чтобы охватить всю таблицу, которую вы прочитали в своем запросе.Если вы читаете несколько больших таблиц в запросе и хотите ограничить каждую из них, не забудьте охватить все комбинации таблиц: например, если вы используете две таблицы и хотите разбить каждую из них на три части, вам потребуется повторить OFFSET.-tted запрос SIX раз с различными комбинациями увеличивающихся значений OFFSET.Пакетный файл будет под рукой, чтобы сделать все это проще.

Таким образом, MySQL создает эти таблицы в памяти (и потенциально конвертирует их во временные таблицы MyISAM), а не Grails.Но я понимаю, что они могут быть результатом слишком сложных запросов.

...