最適なsort_buffer_sizeを決定する方法は?


10

私は次のことを言うサンプル構成ファイルから読みました:

# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
# queries. If sorted data does not fit into the sort buffer, a disk
# based merge sort is used instead - See the "Sort_merge_passes"
# status variable. Allocated per thread if sort is needed.

filesortを使用するクエリがいくつかあります。ディスクにヒットすることなくクエリをスムーズに実行するために必要なバッファーのサイズを決定するにはどうすればよいですか?


mysqltunerまたはtuning-primerを実行しましたか?これらのアプリでmy.cnfについて何か面白いものを見るかもしれません。
David Martinez

回答:


14

sort_buffer_sizeに関係するステータス変数は1つだけです。それはあなたが質問のメッセージに戻ってきたものです:Sort_merge_passes。MySQLのドキュメントは言う:

Sort_merge_passes:ソートアルゴリズムが実行しなければならないマージパスの数。この値が大きい場合は、sort_buffer_sizeシステム変数の値を増やすことを検討してください。

sort_buffer_sizeについて1つ注意してください

SHOW GLOBAL STATUS出力に毎秒多くのSort_merge_passesが表示される場合は、sort_buffer_size値を増やして、クエリの最適化または改善されたインデックス作成では改善できないORDER BYまたはGROUP BY操作を高速化することを検討できます。

レイジングsort_buffer_sizeGROUP BYsとORDER BYs を使用したクエリに役立ちますが、改善できるクエリを改善し、クエリオプティマイザーで使用できるインデックスを追加することをお勧めします。

質問は残ります:Sort_merge_passesをどのようにチェックしますか???

このコードを使用して、過去5分間に発生したSort_merge_passesの数を確認します。また、1時間あたりのSort_merge_passesも計算します。

SET @SleepTime = 300;
SELECT variable_value INTO @SMP1
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SELECT SLEEP(@SleepTime) INTO @x;
SELECT variable_value INTO @SMP2
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SET @SMP = @SMP2 - @SMP1;
SET @SMP_RATE = @SMP * 3600 / @SleepTime;
SELECT @SMP,@SMP_RATE;

Sort_merge_passesと速度が高すぎる場合は、sort_buffer_sizeを増やしてもかまいません。4Mにレイズしたいとします。あなたはこれを実行するでしょう:

mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;

次に、これをmy.cnfに追加します

[mysqld]
sort_buffer_size = 4M

コードを定期的に実行して、Sort_merge_passesスパイクの他の時間をチェックします。


2
これははるかに良い答えです
グレッグ

7
@RolanoMySQLDBA次の「多くの」を定義することができます:「あなたは毎秒何Sort_merge_passesが表示された場合を」
タレク

2

sort_buffer_sizeをデフォルトから変更する必要はありません。質問に基づいてそれが使用されていると誤解している。最初にSQLを調べて、SQLを調整し、インデックスを使用してORDER BY / GROUP BY条件を満たすことができるかどうかを確認する必要があります。通常は複合インデックスになります。

さらに:http : //www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/


その投稿はほとんど役に立たないと思って申し訳ありません。それは、あなたがエキスパートではないからといって、何もしないように人々に言うようなものです。最初のコメンテーターが指摘したように、.cnfmysqlに同梱されているサンプルファイルはデフォルト設定を使用していません。
質問のオーバーフロー2014年

もう一度読んだ場合、エキスパートは値をデフォルトから変更しないことをすでに知っているとも言っています。サンプルの.cnfファイルは、適切な方法として使用または参照しないでください。my.cnfファイルの作成についてサポートが必要な場合、Perconaはかなり完全なウィザードを提供します。tools.percona.com/wizard
eroomydna

2

マニュアル(5.0-5.5)のガイダンスは

SHOW GLOBAL STATUS出力に毎秒多くのSort_merge_passesが表示される場合は、sort_buffer_size値を増やして、クエリの最適化または改善されたインデックス作成では改善できないORDER BYまたはGROUP BY操作を高速化することを検討できます。必要なすべてではない場合でも、バッファ全体が割り当てられるため、グローバルに必要以上に大きく設定すると、ソートするほとんどのクエリの速度が低下します。セッション設定として、より大きなサイズを必要とするセッションに対してのみ、それを増やすことをお勧めします。Linuxでは、256KBと2MBのしきい値があり、値が大きいとメモリ割り当てが大幅に遅くなる可能性があるため、これらの値のいずれかを下回ったままにすることを検討する必要があります。実験して、ワークロードに最適な値を見つけてください。

5.6以降、この表現は、オプティマイザがクエリの値を選択できること、およびサーバーがバッファを制限まで拡張できることを示しています。これにより、値を高く設定しすぎるコストが軽減されます。そのため、5.6.4未満のリリースでは(リリースのcnfファイルと同じように)デフォルトよりも控えめにした方がよいように思えますが、5.6からデフォルトの2MB以上の上限を設定する余裕があります。全額が盲目的に割り当てられていないため、4。

MySQL 5.6.4の時点で、オプティマイザは必要なスペースを計算しようとしますが、上限までさらに割り当てることができます。


1

最適なものを決定する最良の方法sort_buffer_sizeは、それをベンチマークすることです。

どうやって?@RolandoMySQLDBAのように、チェックSort_merge_passesは役立つかもしれないと述べましたが、それがパフォーマンスに影響を与える唯一の要因ではありません。を増やすときは注意が必要ですsort_buffer_size

文書によると

Linuxでは、256KBと2MBのしきい値があり、値が大きいとメモリ割り当てが大幅に遅くなる可能性があるため、これらの値のいずれかを下回ったままにすることを検討する必要があります。

ありますポストと結論テストについては、

sort_merge_passesそんなに悪くない sort_buffer_sizeゼロsort_merge_passesがあるように十分に大きい値を設定することは、最適ではない場合があります。

テストしたところ、同様の結果が得られました。

理想的には、を最適化する必要がある状況を回避することが最善ですsort_buffer_size。どうやって?このORDER BY最適化ドキュメントは、内部でどのように機能するかを理解するのに役立ちます。


-1

「mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;」ソートバッファサイズを4mに入れるのは悪い方法です。これにより、ソートバッファサイズが4GB使用されます。

「mysql> SET GLOBAL sort_buffer_size = 1024 * 4;」

私があなたの場合、短いバッファーサイズを変更しようとはしません。これは、サーバーをクラッシュさせてゴミ箱のパフォーマンスを向上させる良い方法です。より良いクエリを作成することをお勧めします。


1
4Kソートバッファーで大規模なソートを実行するにはどうすればよいですか?あなたが言ったことに注意してください1024 * 4。それは4096、4Kです。
RolandoMySQLDBA 2016年

ローランドが言ったこと^^。最小許容値は32Kです。
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.