为什么我的 MySQL 服务器不断将 HEAP 转换为 MyISAM

为什么我的 MySQL 服务器不断将 HEAP 转换为 MyISAM

我们的 MySQL 服务器时不时会出一些问题。它不断并发抛出大量此类查询(因此将它们堆积在我的进程列表中)。我们正在为 Grails 应用程序使用 MyISAM db 和通过 Glassfish v3 的连接池。

db_user myhost:35143 db 查询 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)创建的临时表导致了这些查询。

答案1

可能是一些事情。

最明显的是您的TMP_TABLE_SIZE变量太小,MySQL 必须在磁盘上而不是在内存中创建临时表。使用以下查询将显示 MySQL 是否正在创建磁盘临时表。

mysql> SHOW STATUS LIKE '%tmp%';

另一个问题可能是应该转到临时表的表BINARYTEXT内存引擎不支持的表,因此您将在磁盘上创建一个 MyISAM 表。

磁盘上创建的临时表是 MyISAM 表。HEAP是表的旧名称MEMORY,因此您必须在 MySQL 5.x 之前的版本上运行 MySQL。

相关内容