7

MySQLサーバーで断続的に問題が発生しています。これらのクエリの多くを同時にスローし続けます(したがって、それらをプロセスリストに積み上げます)。Grailsアプリケーションには、MyISAMデータベースとGlassfishv3を介した接続プールを使用しています。

db_user myhost:35143dbクエリ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サーバーでHEAPをMyISAMに変換し続けるのはなぜですか?

4

1 に答える 1

7

converting HEAP to MyISAMメッセージについて、次の答えが書かれています:

これは、クエリ処理の中間ステップでMySQLによって作成された一時テーブルが大きくなりすぎて、メモリに保存できない場合に発生します。私の知る限り、これを行うと、MySQLは使用するdbエンジンに関係なく一時的なMyISAMテーブルを書き込みます(クエリの最後に削除されるのは一時テーブルだけです)。プロセスにかかる時間以外は問題ありません。

最も簡単な解決策は、tmp_table_sizeを増やすことです。これは、メンテナンス作業を行っている場合は一時的に行うことができます。これだけでは不十分な場合は、LIMITとOFFSETを使用してクエリをチャンクに分割し、OFFSETをステップアップして、クエリで読み取ったすべてのテーブルをカバーします。クエリで複数の大きなテーブルを読み取り、それぞれを制限する必要がある場合は、テーブルのすべての組み合わせをカバーすることを忘れないでください。たとえば、2つのテーブルを使用し、それぞれを3つの部分に分割する場合は、OFFSETを繰り返す必要があります。 -OFFSETの値を増やすさまざまな組み合わせで6回クエリを実行しました。これらすべてを簡単にするために、バッチファイルが手元にあります。

そのため、MySQLは、Grailsではなく、これらのメモリ内テーブルを作成しています(そして潜在的にそれらを一時的なMyISAMテーブルに変換しています)。しかし、私の理解では、クエリが多すぎることが原因である可能性があります。

于 2010-06-26T17:10:43.483 に答える