web-dev-qa-db-ja.com

「Created_tmp_disk_tables」を下げる方法-DISKで作成された一時テーブル数

私は何千人ものユーザーが頻繁に使用するUbuntuのmysql 5.6 DBを持っています。 10日間実行した後、次の値を取得しました。

| Created_tmp_disk_tables | 894170 |
| Created_tmp_files       | 26068  |
| Created_tmp_tables      | 914511 |

私の設定値は:

| tmp_table_size | 268435456 |
| max_heap_table_size | 1073741824 |

私がtmp_table_size = 16MBとmax_heap_table_size = 16MBを持っているとき、それは同じでした。私はそれをtmp_table_size = 256MBとmax_heap_table_size = 1GBに変更しましたが、Created_tmp_disk_tablesは成長を止めませんでした。レートはまったく同じです。

26GBのヒープがあります。すべてのテーブルはINNODBです。

何が欠けていますか?

ありがとう

5
Libor Havlicek

「26GBヒープ」とはどういう意味ですか?

_tmp_table_size = 256M_は危険です。複数の接続がtmpテーブルを必要とする場合、RAMが不足する可能性があります。スワップは悪いさまざまな設定を下げるよりもパフォーマンスが向上します。

Tmpテーブルは、多くの状況で必要です。それらを恐れないでください。しかし、それらを確認してください。

DISTINCT、_GROUP BY_、_ORDER BY_およびUNIONはしばしばrequire tmpテーブルです。 tmpテーブルがmin(tmp_table_size, max_heap_table_size)に収まる場合、tmpテーブルmayはRAM using _Engine=MEMORY_を使用)になります。それより大きい場合、その場合、tmpテーブルは_Engine=MyISAM_で低速ですMyISAMを使用する理由は他にもありますが、特にTEXTフィールドを選択しているためです 詳細

もう1つの一般的な「エラー」は、VARCHAR(255)とutf8を盲目的に使用することです。 MEMORYを使用すると、それは765バイトのCHARになり、MyISAMへの変換を早めます。

あなたが与えた数字...

  • Created_tmp_disk_tablesは、Created_tmp_tablesとほぼ同じ大きさです-これは、_tmp_table_size_が十分に大きくないか(私は疑問です)、またはMEMORYを使用できないことを意味します(私はそう思います)。私の分析では、20%を上回っています。
  • Created_tmp_tables/Uptime-20 /秒以上は赤旗
  • Created_tmp_disk_tables/Uptime-1 /秒以上は赤旗です
  • Created_tmp_disk_tables/Questions-4%以上は赤旗

Long_query_time = 1を設定し、SlowLogをオンにします。できればFILEにします。 1日待ってから、slowlogでpt-query-digestを使用して、「最悪の」クエリを見つけます。それらを改善する方法がわからない場合は、お問い合わせください。

私は2つの項目でRolandoに同意しません。

  • RAMディスクは悪い考えです。MySQLを裏切るよりも、他のキャッシュに追加のRAM=を与えることをお勧めします。
  • _OPTIMIZE TABLE_が役立つことはほとんどなく、質問にはあまり関係がありません。
11
Rick James

レートがまったく同じ場合は、クエリまたは構成を調整する必要があります。どうして ?

tmp_table_sizemax_heap_table_size の調整については前に説明しました

join_buffer_size および sort_buffer_size (2番目の投稿を見てください)

1
RolandoMySQLDBA