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%

以前の一時テーブルは「23725の一時テーブルのうち38%がディスク上に作成されました」でしたが、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

デフォルトの設定を持つ別のシステムは、同じデータベースで「23725の一時テーブルのうち、1%がディスク上に作成された」と示しています。

この問題が発生したマシンでデフォルトに変更してみましたが、「580の一時テーブルのうち、16%がディスク上に作成されました」と表示されます。

私はUbuntu 11.4 64ビットと48 GB RAMを使用しています。誰かが解決策を提案できますか?

「group by」を使用してテーブルのdbエンジンを「myisam」から「memory」に変更すると、これは修正されますか?ここで説明したように: http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/

13
ananthan.nair

mysqltunerが有用な情報を提供することはほとんどありません。 「ヒット率」についてはほとんど関係のない統計を使用し、許容できるウィジェットの許容数に任意の制限を課します。パフォーマンスの問題に直面していない場合は、実際に発生する問題を解決する必要はありません。とはいえ、一時テーブルに関する背景情報を少し紹介します...

MySQLは暗黙的に一時テーブルを作成するためにMEMORYストレージエンジンを内部的に使用します。ディスクの一時テーブルでは、MyISAMストレージエンジンを使用します。

一時テーブルは、次の場合にディスク上に作成されます。

  • TEXTまたはBLOBフィールドが存在する(MEMORYはこれらのタイプをサポートしていないため)
  • 結果の暗黙的な一時テーブルのサイズがtmp_table_sizeまたはmax_heap_table_sizeの小さい方を超えています
  • 512バイトを超える列がGROUP BY、UNION、またはORDER BYで使用されている場合

詳細については、内部一時テーブルの MySQLドキュメント を参照してください。

これについて何ができますか?それが実際にパフォーマンスの問題を表していると仮定すると(単にあなたを知的に煩わせるだけでなく):

  • TEXT/BLOBフィールドを避け、可能な場合は適切なサイズのVARCHARまたはCHARフィールドを使用してください。
  • TEXT/BLOBが避けられない場合は、それらを隔離して、必要な場合にのみ、外部キー関係とJOINでテーブルを分離します。
  • 上記のTEXT/BLOBフィールドと同様に、512バイトを超える大きな列を扱います。
  • クエリが必要な結果セットのみを返すようにします(適切に選択したWHERE句、SELECT *は避けてください)
  • 特に大きな結果セットを返す場合は、サブクエリを避けて結合に置き換えます。
  • 最後の手段-tmp_table_sizemax_heap_table_sizeの両方をレイズします。クエリを最適化できないことが判明しない限り、これを行わないでください。

MySQLの設定に不安があり、利用可能な設定を自分で使い慣れていない場合は、開始点として Percona設定ウィザード を確認することをお勧めします。

「group by」を使用してテーブルのdbエンジンを「myisam」から「memory」に変更すると、これは修正されますか?ここで説明したように

いいえ、そうではなく、テーブルがディスクに永続化されることはありません。これを行わないでください。

16
Aaron Brown

「一時的な使用」と「ファイルソートの使用」は世界の終わりではありません!

SELECT ... GROUP BY a、b ORDER BY c、d-1つまたは2つの「一時テーブル」が必要です。

クエリが一時テーブルを使用する場合があります。一時テーブルは、小さな要因でクエリを遅くする可能性があります。ただし、クエリが「十分に高速」である場合は、心配する必要はありません。

クエリが遅すぎる場合(tmpテーブルの有無にかかわらず)、それについて説明しましょう。 SHOW CREATE TABLE、SHOW TABLE STATUS、およびEXPLAINを提供してください。

2
Rick James