it-swarm.com.de

Wie bestimme ich die optimale sort_buffer_size?

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?

10

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 eine Sache über 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 Erhöhen von sort_buffer_size Abfragen mit GROUP BY Und ORDER BY S helfen kann, ist es besser, die Abfragen zu verbessern, die Sie verbessern können, und Indizes hinzuzufügen, die vom Abfrageoptimierer verwendet werden können .

Die Frage bleibt: Wie überprü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 Rate zu hoch finden, können Sie sort_buffer_size erhöhen. 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 nach anderen Zeiten zu suchen Sort_merge_passes spikes.

14
RolandoMySQLDBA

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.

2
ClearCrescendo

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/

2
eroomydna

Der beste Weg, um das optimale sort_buffer_size ist es zu vergleichen.

Wie? Wie @RolandoMySQLDBA sagte, prüfe Sort_merge_passes mag hilfreich sein, aber das ist nicht der einzige Faktor, der die Leistung beeinflusst. Sie sollten vorsichtig sein, wenn Sie die 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, die das schließen

sort_merge_passes sind nicht so schlimm. Einstellen Ihres sort_buffer_size groß genug, damit es Null gibt sort_merge_passes ist möglicherweise nicht optimal.

Beim Testen erhalte ich auch ein ähnliches Ergebnis.

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

1
Sanghyun Lee