56

2 日前に私のサーバーで my tmp_table_size= max_heap_table_size(16M).

1 時間に 1 回実行され、次から始まるレポートを生成する cron ジョブを作成しました: created_tmp_disk_tables, created_tmp_files,created_tmp_tables

私のレポートでは : created_tmp_disk_tables+ created_tmp_files+ created_tmp_tables= 一時データの 100%

それと :

  1. tmp_table_size= max_heap_table_size=16Mレポートは、次の平均レポートを示しました 。
    • 27.37% (created_tmp_disk_tables)
    • 1.16% (created_tmp_files)
    • 71.48% (created_tmp_tables)

これらの結果を最適化するにはどうすればよいですか?

  1. 最初の 1 時間に= tmp_table_size=max_heap_table_sizeを使用:20M

    • 23.48% (created_tmp_disk_tables)
    • 32.44% (created_tmp_files)
    • 44.07% (created_tmp_tables)

7 時間後 (再起動から):

  • 21.70% (created_tmp_disk_tables)
  • 33.75% (created_tmp_files)
  • 44.55% (created_tmp_tables)

それは私が期待したものではありません。

  • ディスク テーブルが から27.37%に減少21.70%-> 期待されるより多くの
  • 1.16%一時ファイルがフォームから上昇する33.75% -> なぜ?
  • メモリ テーブルが から -> 奇妙に減少し71.48%ました44.55%。上がると予想される
4

1 に答える 1

192

tmp_table_sizemax_heap_table_sizeを増やすときはいつでも、これらを設定してもクエリの動作が改善されないことに注意してください。実際には、非効率的なクエリの動作が以前よりも悪くなります。どのような状況で?

ORDER BYクエリがインデックスを利用せずに(を介して)結合またはソートを実行する場合、一時テーブルをメモリ内に形成する必要があります。これにより、 Created_tmp_tablesがインクリメントされます。

一時テーブルがtmp_table_sizeのバイト数まで増加し、より多くのスペースが必要になった場合はどうなりますか?次の一連のイベントが発生します。

  1. クエリ処理を停止する必要があります
  2. ディスク上に一時テーブルを作成します
  3. メモリベースの一時テーブルの内容をディスクベースの一時テーブルに転送します
  4. メモリベースの一時テーブルにドロップします
  5. クエリ処理は、ディスクベースの一時テーブルを使用して続行されます

このプロセスはCreated_tmp_disk_tablesをインクリメントします

これらのメカニズムを知って、各インスタンスで何が起こったのかを調べてみましょう

ディスクテーブルは27.37%から21.70%に減少しました->さらに多くのことが期待されます

これは、以前に実行されたクエリが結果をキャッシュしてRAMに残っている場合に簡単に発生する可能性があります。これにより、クエリを最初から処理する必要がなくなり、同じ大きな一時テーブルを再作成する必要がなくなります。

一時ファイルは1.16%から33.75%に上昇します->なぜですか?

これは驚くべきことではありません。これは、一時テーブルを必要とするクエリがあるという事実を単に明らかにします。それらは最初にRAMで作成されました。これは、うまく結合しないクエリ(join_buffer_sizeが小さすぎる可能性があります)またはORDER BYインデックス付けされていない列または一時テーブルを持つ列(sort_buffer_sizeが小さすぎる可能性があります)の存在を示しています。

メモリテーブルが71.48%から44.55%に減少しました->奇妙です。上昇が見込まれる

これも驚くべきことではありません。同じ値を持つ同じクエリに対して十分な呼び出しがある場合、以前にキャッシュされた結果からのクエリの実行によって、並べ替えと結合がプリエンプトされる可能性があります。

おすすめ

これらのことに照らして、調整できるものは次のとおりです。

  • join_buffer_size
  • sort_buffer_size
  • 使用するインデックスを作成する
    • eq_refを介した結合
    • インデックススキャンを順番に並べ替える

全体的な目標は、一時テーブルの作成を可能な限り防ぐことです。tmp_table_sizemax_heap_table_sizeを増やすだけで、適切なインデックスがない非効率的なクエリとテーブルが正常に実行されます。

于 2013-02-01T18:06:29.693 に答える