Wie bestimme ich die optimale sort_buffer_size?


10

Ich habe aus einer Beispielkonfigurationsdatei gelesen, die Folgendes enthält:

# 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.

Ich habe ein paar Fragen, die Dateisortierung verwenden. Wie bestimme ich die Größe des Puffers, den ich benötige, damit Abfragen reibungslos ausgeführt werden können, ohne die Festplatte zu berühren?


Haben Sie mysqltuner oder tuning-primer ausgeführt ? In diesen Apps sehen Sie möglicherweise etwas Interessantes an Ihrer my.cnf.
David Martinez

Antworten:


14

Es gibt nur eine Statusvariable, die sich um sort_buffer_size kümmert . Das haben Sie in der Nachricht zurück in der Frage: Sort_merge_passes . Die MySQL-Dokumentation sagt:

Sort_merge_passes: Die Anzahl der Zusammenführungsdurchläufe, die der Sortieralgorithmus ausführen musste. Wenn dieser Wert groß ist, sollten Sie den Wert der Systemvariablen sort_buffer_size erhöhen.

Bitte beachten Sie eines bei sort_buffer_size

Wenn in der Ausgabe von SHOW GLOBAL STATUS viele Sort_merge_passes pro Sekunde angezeigt werden, können Sie den Wert sort_buffer_size erhöhen, um ORDER BY- oder GROUP BY-Operationen zu beschleunigen, die durch Abfrageoptimierung oder verbesserte Indizierung nicht verbessert werden können

Während das sort_buffer_sizeErhöhen Abfragen mit GROUP BYs und ORDER BYs unterstützen kann, ist es besser, die Abfragen zu verbessern, die Sie verbessern können, und Indizes hinzuzufügen, die vom Abfrageoptimierer verwendet werden können.

Frage bleibt: Wie prüft man die Sort_merge_passes ???

Verwenden Sie diesen Code, um zu überprüfen, wie viele Sort_merge_passes in den letzten 5 Minuten aufgetreten sind. Außerdem werden die Sort_merge_passes pro Stunde berechnet.

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;

Wenn Sie die Sort_merge_passes und die Geschwindigkeit zu hoch finden, dann fühlen Sie sich frei zu erhöhen sort_buffer_size . Angenommen, Sie möchten auf 4M erhöhen. Sie würden dies ausführen:

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

Sie würden dies dann zu my.cnf hinzufügen

[mysqld]
sort_buffer_size = 4M

Sie würden den Code regelmäßig ausführen, um zu anderen Zeiten nach Sort_merge_passes- Spitzen zu suchen .


2
Dies ist die viel bessere Antwort
Greg

7
@ RolanoMySQLDBA können Sie "viele" im Folgenden definieren: "Wenn Sie viele Sort_merge_passes pro Sekunde sehen"
Tarek

2

Sie müssen die sort_buffer_size nicht von der Standardeinstellung ändern. Sie verstehen die Verwendung aufgrund der Frage falsch. Sie sollten zunächst die SQL untersuchen, um festzustellen, ob Sie sie optimieren und die ORDER BY / GROUP BY-Bedingungen mithilfe eines Index erfüllen können. Es wird im Allgemeinen ein zusammengesetzter Index sein.

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


Es tut mir leid zu sagen, dass ich diesen Beitrag kaum nützlich finde. Es ist, als würde man den Leuten sagen, dass sie etwas nicht tun sollen, nur weil Sie kein Experte sind. Wie der erste Kommentator betonte, .cnfverwenden die mit MySQL gelieferten Beispieldateien nicht die Standardeinstellung.
Frage Überlauf

Wenn Sie es erneut lesen, heißt es auch, dass der Experte bereits weiß, den Wert nicht vom Standardwert zu ändern. Die .cnf-Beispieldateien sollten nicht als bewährte Methode verwendet oder referenziert werden. Wenn Sie Hilfe beim Erstellen einer my.cnf-Datei benötigen, bietet Percona einen ziemlich gründlichen Assistenten an. tools.percona.com/wizard
eroomydna

2

Die Anleitung im Handbuch (5.0-5.5) lautet

Wenn in der Ausgabe von SHOW GLOBAL STATUS viele Sort_merge_passes pro Sekunde angezeigt werden, können Sie den Wert sort_buffer_size erhöhen, um ORDER BY- oder GROUP BY-Operationen zu beschleunigen, die durch Abfrageoptimierung oder verbesserte Indizierung nicht verbessert werden können. Der gesamte Puffer wird zugewiesen, auch wenn nicht alle benötigt werden. Wenn Sie ihn also global größer als erforderlich einstellen, werden die meisten Abfragen dieser Art verlangsamt. Es ist am besten, es als Sitzungseinstellung zu erhöhen und nur für Sitzungen, die eine größere Größe benötigen. Unter Linux gibt es Schwellenwerte von 256 KB und 2 MB, bei denen größere Werte die Speicherzuweisung erheblich verlangsamen können. Sie sollten daher in Betracht ziehen, unter einem dieser Werte zu bleiben. Experimentieren Sie, um den besten Wert für Ihre Arbeitsbelastung zu finden.

Ab 5.6 zeigt der Wortlaut an, dass der Optimierer einen Wert für eine Abfrage auswählen kann und dass der Server den Puffer bis zum Limit erweitern kann. Dies verringert die Kosten für die Einstellung eines zu hohen Werts. Es hört sich also so an, als ob Sie konservativ sein möchten, niedriger als der Standardwert (wie es die Release-CNF-Dateien tun) für Releases unter 5.6.4, aber es sich leisten können, ein höheres Limit von beispielsweise Standard-2 MB oder sogar mehr von 5.6 festzulegen. 4, da der volle Betrag nicht blind zugeteilt wird.

Ab MySQL 5.6.4 versucht der Optimierer herauszufinden, wie viel Speicherplatz benötigt wird, kann jedoch bis zum Limit mehr Speicherplatz zuweisen.


1

Der beste Weg, um das Optimum zu bestimmen, sort_buffer_sizeist das Benchmarking.

Wie? Wie bei @RolandoMySQLDBA Sort_merge_passeskönnte die Überprüfung hilfreich sein, aber das ist nicht der einzige Faktor, der die Leistung beeinflusst. Sie sollten vorsichtig sein, wenn Sie die erhöhen sort_buffer_size.

Das Dokument sagt das

Unter Linux gibt es Schwellenwerte von 256 KB und 2 MB, bei denen größere Werte die Speicherzuweisung erheblich verlangsamen können. Sie sollten daher in Betracht ziehen, unter einem dieser Werte zu bleiben.

Es gibt einen Beitrag über die Tests, der daraus schließt

sort_merge_passessind nicht so schlimm. sort_buffer_sizeEs ist sort_merge_passesmöglicherweise nicht optimal, Ihre Größe so einzustellen, dass sie Null ist .

Beim Testen erhalte ich auch ein ähnliches Ergebnis.

Im Idealfall ist es am besten, die Situation zu vermeiden, die Sie zur Optimierung benötigen sort_buffer_size. Wie? Dieses Dokument ORDER BY Optimization kann Ihnen helfen, die Funktionsweise unter der Haube zu verstehen.


-1

"mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;" Es ist eine schlechte Möglichkeit, die Größe des Sortierpuffers in 4 m einzugeben. Dadurch wird die Größe des Sortierpuffers für 4 GB verwendet

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

Wenn ich Ihr gewesen bin, versuche ich nicht, die Größe des kurzen Puffers zu ändern. Dies ist ein guter Weg, um Ihren Server zum Absturz zu bringen und die Leistung in den Papierkorb zu senden. Es ist besser, bessere Abfragen zu machen.


1
Wie kann eine große Sortierung in einem 4K-Sortierpuffer erfolgen? Beachten Sie, dass Sie gesagt haben 1024 * 4. Das sind 4096, 4K.
RolandoMySQLDBA

Was Rolando gesagt hat ^^. Der minimal zulässige Wert beträgt 32 KB.
Ypercubeᵀᴹ
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.