7

我们的 MySQL 服务器间歇性地出现了一些问题。它不断地同时抛出大量这些查询(因此将它们堆叠在我的进程列表中)。我们正在为 Grails 应用程序使用 MyISAM 数据库和通过 Glassfish v3 进行的连接池。

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)创建的临时表导致了这些查询。为什么我的 mysql 服务器上不断出现 Converting HEAP to MyISAM?

4

1 回答 1

7

关于该converting HEAP to MyISAM消息,以下答案写道:

当 MySQL 在查询处理的中间步骤中创建的临时表变得太大而无法存储在内存中时,就会发生这种情况。据我所知,在执行此操作时,MySQL 会写入临时 MyISAM 表,而与您使用的数据库引擎无关(它只是一个临时表,将在查询结束时被删除)。除了过程花费的时间之外,这没有问题。

最简单的解决方案是增加 tmp_table_size,如果您正在做维护工作,可能是暂时的。如果这还不够,请使用 LIMIT 和 OFFSET 将您的查询分成块,并逐步增加 OFFSET 以覆盖您在查询中读取的所有表。如果您在查询中读取多个大表并且需要限制每个表,请不要忘记涵盖表的所有组合:例如,如果您使用两个表并希望将每个表拆分为三个部分,您将需要重复 OFFSET -ted 使用 OFFSET 递增值的不同组合查询六次。一个批处理文件将出现在手边,使这一切变得更容易。

所以 MySQL 正在创建这些内存表(并可能将它们转换为临时 MyISAM 表),而不是 Grails。但我的理解是,它们可能是由过于繁重的查询引起的。

于 2010-06-26T17:10:43.483 回答