MySQLがディスク上に非常に多くの一時テーブルを作成しているのはなぜですか?


13

構成の間違いにより、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/

回答:


16

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

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

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

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

詳細については、内部一時テーブルに関するMySQLドキュメントをお読みください。

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

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

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

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

いいえ、そうではなく、テーブルがディスクに永続化されないようにします。これをしないでください。


+1、tmp_table_sizeまたはそれより小さいことを追加max_heap_table_size
デレクダウニー

mysqltunerによる最善の推奨事項は、スロークエリログを有効にすることでした。遅いクエリがあればそれを特定するのに役立ちます。
fat_mike

2

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

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

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

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


1
にインデックスがある場合(a, b, c, d)、一時テーブルはありません。
イヴァン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.