![为什么我的 MySQL 服务器不断将 HEAP 转换为 MyISAM](https://linux22.com/image/517435/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%20MySQL%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8D%E6%96%AD%E5%B0%86%20HEAP%20%E8%BD%AC%E6%8D%A2%E4%B8%BA%20MyISAM.png)
我们的 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%';
另一个问题可能是应该转到临时表的表BINARY
或TEXT
内存引擎不支持的表,因此您将在磁盘上创建一个 MyISAM 表。
磁盘上创建的临时表是 MyISAM 表。HEAP
是表的旧名称MEMORY
,因此您必须在 MySQL 5.x 之前的版本上运行 MySQL。