web-dev-qa-db-ja.com

MySQLがこれほど多くの一時テーブルを使用しているのはなぜですか?

設定ミスにより、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_heaptmp_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からテーブルのメモリに変更するとこれが修正されますか?

4
ananthan

実行中のクエリに応じて、必要に応じて一時テーブルが作成および削除されます。表示されている数値は、MySQLが最後に起動されてから作成された一時テーブルの合計であり、同時に存在する数ではありません。

5
John Gardeniers

クエリをシングルパスで計算できない場合、MySQLは一時テーブルを使用します。ストレージエンジンを切り替えても、それは変わりません。問題はqueryにあり、構成ではありません。

tmp_table_size値を大きくすると、一部がディスクに書き込まれなくなり、メモリ内に作成されてデータでいっぱいになります。このデータはおそらく最初はディスクからのものですが、48GBのRAMの場合、おそらくかなりの量のデータがキャッシュされています。これらの一時テーブルの30%は200MBを超えるため、キャッシュされていても、 RAMでその量のデータをコピーするには、まだ時間がかかります。

クエリを実行する前に、EXPLAIN構文を使用して、一時テーブルを使用するかどうかを決定できます。クエリの前にEXPLAINを置くだけで、実際に実行しなくても、実行プランとクエリの効率に関する一連の情報が出力されます。

これらの一時テーブルの原因となっているクエリは、おそらく遅いクエリである可能性が高く、したがって遅いクエリログに記録されるため、おそらく見つけることができます。

特定のクエリの調整についてサポートが必要な場合は、 DBA.SE が最適です。

TL; DR

クエリを調整します。

3
Ladadadada