設定ミスにより、mysql..mysqlチューナーショーによって作成される一時テーブルが多すぎる可能性がありますか?
Current max_heap_table_size = 200 M
Current tmp_table_size = 200 M
Of 17158 temp tables, 30% were created on disk
table_open_cache = 125 tables
table_definition_cache = 256 tables
You have a total of 97 tables
You have 125 open tables.
Current table_cache hit rate is 3%
以前の一時テーブルはof the 23725 temp tables 38% were created on disk
でしたが、max_heap
とtmp_table
を16mから200mに変更し、30%に下げました。
engine myisam
group_concat_max_len = 32768
key_buffer_size = 3.7 GB,
thread_stack = 256k,
table_cache = 125
query_cache_limit = 1M
query_cache_size = 16M
join_buffer_size = 2.00 M
max_connections = 800
デフォルト設定の別のシステムはof 23725 temp tables, 1% were created on disk
を表示しています
しかし、この問題のあるマシンでデフォルトに変更しようとしましたが、それでもOf 580 temp tables, 16% were created on disk
が表示されます
私はUbuntu11.464ビットと48GBのRAMを使用しています...誰かが解決策を提案できますか?
「groupby」を使用してデータベースエンジンをmyisamからテーブルのメモリに変更するとこれが修正されますか?
実行中のクエリに応じて、必要に応じて一時テーブルが作成および削除されます。表示されている数値は、MySQLが最後に起動されてから作成された一時テーブルの合計であり、同時に存在する数ではありません。
クエリをシングルパスで計算できない場合、MySQLは一時テーブルを使用します。ストレージエンジンを切り替えても、それは変わりません。問題はqueryにあり、構成ではありません。
tmp_table_size
値を大きくすると、一部がディスクに書き込まれなくなり、メモリ内に作成されてデータでいっぱいになります。このデータはおそらく最初はディスクからのものですが、48GBのRAMの場合、おそらくかなりの量のデータがキャッシュされています。これらの一時テーブルの30%は200MBを超えるため、キャッシュされていても、 RAMでその量のデータをコピーするには、まだ時間がかかります。
クエリを実行する前に、EXPLAIN
構文を使用して、一時テーブルを使用するかどうかを決定できます。クエリの前にEXPLAIN
を置くだけで、実際に実行しなくても、実行プランとクエリの効率に関する一連の情報が出力されます。
これらの一時テーブルの原因となっているクエリは、おそらく遅いクエリである可能性が高く、したがって遅いクエリログに記録されるため、おそらく見つけることができます。
特定のクエリの調整についてサポートが必要な場合は、 DBA.SE が最適です。
TL; DR
クエリを調整します。