Pourquoi définir `group_concat_max_len` en dessous du maximum?

9

MySQL 5.5.28 sur Ubuntu 12.04

Si le résultat est plus long que group_concat_max_lenle résultat est tronqué sans grâce.

Actuellement, j'ai un script qui essaie de vérifier la longueur requise à l'avance et qui group_concat_max_lenest suffisamment grand.

Mais la vérification ajoute des requêtes supplémentaires. Y a-t-il un inconvénient à simplement définir group_concat_max_lenla valeur maximale? L'avantage est moins de requêtes.

Buttle Butkus
la source
La question semble être "Si je la règle trop haut, vais-je manquer de RAM et planter, ou quelque chose?". Pendant ce temps, 1024 octets est une quantité insignifiante, et il ne semble pas nécessaire de le définir en dessous de cela.
Rick James
@RickJames RAM, CPU, etc., oui. "La requête prendra-t-elle du temps ou consommera-t-elle une grande partie des ressources système?"
Buttle Butkus
1
Mais, si vous dites 1G, utilise-t-il immédiatement 1G ou commence-t-il par une petite valeur et progresse-t-il si nécessaire?
Rick James
1
J'ai un script similaire. Je voulais prendre en compte les chaînes de caractères 1M 32. J'ai d'abord été surpris de voir qu'ils prenaient 329999999 octets dans le tampon group_concat. La morale de cette histoire est de ne pas oublier de tenir compte des virgules.
MatrixManAtYrService

Réponses:

2

Selon MySQL BOL ici

La valeur maximale group_concat_max_lenpour 64 bits est 18446744073709551615

&

La valeur maximale group_concat_max_lenpour 32 bits est 4294967295

Le résultat est tronqué à la longueur maximale donnée par la group_concat_max_lenvariable système, qui a un default value of 1024. La valeur peut être définie plus haut, bien que la longueur maximale effective de la valeur de retour soit limitée par la valeur de max_allowed_packet. La syntaxe pour modifier la valeur de group_concat_max_lenat runtimeest la suivante, où val est un unsigned integer:

SET [GLOBAL | SESSION] group_concat_max_len = val;

Remarque: La maximum permittedlongueur du résultat dans bytespour la GROUP_CONCAT()fonction. La valeur par défaut est 1024.

Comme MySQL documenté le blog ici En utilisant GROUP_CONCATun petit group_concat_max_lenparamètre? Votre résultat sera silently truncated(assurez-vous cependant de vérifier les avertissements).

As MySQL Blog by Here : Ce paramètre limite la longueur du texte d'un résultat de concaténation. Il est par défaut . Je pense que c'est une valeur très faible. J'ai utilisé de plus en plus, récemment, pour résoudre des problèmes autrement difficiles. Et dans la plupart des cas, c'était juste , entraînant une troncature silencieuse (Argh!) Du résultat, retournant ainsi des résultats incorrects. Il est intéressant d'apprendre que la valeur maximale de ce paramètre est limitée par . Je suggérerais alors que ce paramètre devrait être complètement supprimé et avoir le comme le . Sinon, j'aimerais qu'il en ait un , de l'ordre de quelques-uns .@Shlomi Noach group_concat_max_lenmaximumGROUP_CONCAT1024GROUP_CONCAT1024too lowmax_packet_sizemax_packet_size limitationonly limitationvery large default valueMB

Pour plus loin votre ref ici & ici

Md Haidar Ali Khan
la source
Ma question est un peu plus nuancée et granulaire. J'ai déjà lu le manuel, donc votre travail de copier-coller ne m'aide pas. Merci quand même pour l'effort.
Buttle Butkus
@Buttle Butkus, Chaque application dispose d'un ensemble de taille de paramètre de variable d'environnement par défaut, min et max.
Md Haidar Ali Khan
Oui, j'aimerais connaître l'impact sur les performances de la modification de ce paramètre. Est-ce que cela aurait un impact important sur TOUTES les requêtes ou seulement celles où de grandes concaténations se produisent?
Buttle Butkus
1
@ButtleButkus, vous savez que "SET GLOBAL" signifie que le paramètre affectera toutes les autres connexions MySQL sur votre serveur, et le paramètre persistera même après la fin de votre session en cours, jusqu'à ce que vous le définissiez sur autre chose? Vous souhaiterez peut-être utiliser "SET SESSION" si vous souhaitez que la valeur affecte uniquement votre session en cours.
Md Haidar Ali Khan
1
Merci, mais je sais déjà ces choses et elles n'ont rien à voir avec ma question.
Buttle Butkus
2

J'apprécie que cette question soit un peu ancienne maintenant, mais au cas où quelqu'un la trouverait et se demanderait, un inconvénient de la définition de la valeur maximale (ou sinon très grande) est que group_concat peut retourner un blob plutôt qu'un varchar. Les suggestions ailleurs disent de définir group_concat_max_len à 512 pour qu'il retourne toujours un varchar plutôt qu'un blob. Cependant, j'ai tendance à le jeter en caractères au besoin.

Peter
la source