Warum sollte `group_concat_max_len` unter das Maximum gesetzt werden?

9

MySQL 5.5.28 unter Ubuntu 12.04

Wenn das Ergebnis länger als group_concat_max_lenist, wird das Ergebnis grazil abgeschnitten.

Derzeit habe ich ein Skript, das versucht, die erforderliche Länge im Voraus zu überprüfen, und das so eingestellt ist group_concat_max_len, dass es groß genug ist.

Durch die Überprüfung werden jedoch zusätzliche Abfragen hinzugefügt. Gibt es einen Nachteil, wenn Sie nur group_concat_max_lenden Maximalwert einstellen ? Der Vorteil ist weniger Anfragen.

Buttle Butkus
quelle
Die Frage scheint zu lauten: "Wenn ich es zu hoch einstelle, geht mir dann der Arbeitsspeicher aus und ich stürze ab oder so?". In der Zwischenzeit sind 1024 Bytes eine triviale Menge, und es scheint nicht notwendig zu sein, sie jemals darunter zu setzen.
Rick James
@ RickJames RAM, CPU usw. ja. "Wird die Abfrage lange dauern oder einen großen Teil der Systemressourcen verbrauchen?"
Buttle Butkus
1
Aber wenn Sie 1G sagen, verwendet es sofort 1G oder beginnt es mit einem kleinen Wert und arbeitet sich bei Bedarf nach oben?
Rick James
1
Ich habe ein ähnliches Skript. Ich wollte 1M 32 Zeichenketten berücksichtigen. Ich war zunächst überrascht zu sehen, dass sie 329999999 Bytes im Puffer group_concat belegten. Die Moral dieser Geschichte ist nicht zu vergessen, die Kommas zu berücksichtigen.
MatrixManAtYrService

Antworten:

2

Gemäß MySQL BOL hier

Der Maximalwert group_concat_max_lenfür 64-Bit ist 18446744073709551615

&

Der Maximalwert group_concat_max_lenfür 32-Bit ist 4294967295

Das Ergebnis wird auf die maximale Länge gekürzt, die von der group_concat_max_lenSystemvariablen mit a angegeben wird default value of 1024. Der Wert kann höher eingestellt werden, obwohl die effektive maximale Länge des Rückgabewerts durch den Wert von begrenzt ist max_allowed_packet. Die Syntax zum Ändern des Werts von group_concat_max_lenat runtimelautet wie folgt: val ist ein unsigned integer:

SET [GLOBAL | SESSION] group_concat_max_len = val;

Hinweis: Die maximum permittedErgebnislänge bytesfür die GROUP_CONCAT()Funktion. Der Standardwert ist 1024.

Wie MySQL Blog hier dokumentiert Mit GROUP_CONCATeiner kleinen group_concat_max_lenEinstellung? Ihr Ergebnis wird sein silently truncated(überprüfen Sie jedoch unbedingt die Warnungen).

Als MySQL-Blog von Here : Dieser Parameter begrenzt die Textlänge eines Verkettungsergebnisses. Der Standardwert ist . Ich denke, das ist ein sehr niedriger Wert. Ich habe in letzter Zeit immer mehr verwendet, um ansonsten schwierige Probleme zu lösen. Und in den meisten Fällen war es gerecht , was zu einem stillen (Argh!) Abschneiden des Ergebnisses führte, wodurch falsche Ergebnisse zurückgegeben wurden. Es ist interessant zu erfahren, dass der Maximalwert für diesen Parameter durch begrenzt ist . Ich würde dann vorschlagen, dass dieser Parameter insgesamt entfernt werden sollte und das als . Ansonsten hätte ich gerne eine in der Größenordnung von ein paar .@Shlomi Noach group_concat_max_lenmaximumGROUP_CONCAT1024GROUP_CONCAT1024too lowmax_packet_sizemax_packet_size limitationonly limitationvery large default valueMB

Für weitere Ihre ref Here & Here

Md Haidar Ali Khan
quelle
Meine Frage ist etwas nuancierter und detaillierter. Ich habe das Handbuch bereits gelesen, sodass mir das Kopieren und Einfügen nicht hilft. Vielen Dank für die Mühe.
Buttle Butkus
@Buttle Butkus, Jede Anwendung hat eine Reihe von Standardparametern für Umgebungsvariablen, min und max. Wenn Sie dort den Grenzwert für die Parameter nicht einhalten, verhält sich diese Anwendung abrupt.
Md Haidar Ali Khan
Ja, ich möchte wissen, welche Auswirkungen die Änderung dieser Einstellung auf die Leistung hat. Würde es ALLE Abfragen oder nur diejenigen, bei denen große Verkettungen auftreten, stark beeinflussen?
Buttle Butkus
1
@ButtleButkus, Sie wissen, dass "SET GLOBAL" bedeutet, dass die Einstellung alle anderen MySQL-Verbindungen auf Ihrem Server beeinflusst und die Einstellung auch nach Abschluss Ihrer aktuellen Sitzung beibehalten wird, bis Sie sie auf etwas anderes setzen? Möglicherweise möchten Sie "SET SESSION" verwenden, wenn der Wert nur Ihre aktuelle Sitzung beeinflussen soll.
Md Haidar Ali Khan
1
Danke, aber ich kenne diese Dinge bereits und sie haben nichts mit meiner Frage zu tun.
Buttle Butkus
2

Ich weiß, dass diese Frage jetzt etwas alt ist, aber falls jemand sie findet und sich wundert, besteht ein Nachteil beim Festlegen des maximalen (oder ansonsten sehr großen) Werts darin, dass group_concat eher einen Blob als einen varchar zurückgeben kann. An anderer Stelle wird vorgeschlagen , group_concat_max_len auf 512 zu setzen, damit immer ein varchar anstelle eines Blobs zurückgegeben wird. Ich neige dazu, es nur zu char zu werfen, wo es nötig ist.

Peter
quelle