¿Por qué establecer `group_concat_max_len` por debajo del máximo?

9

MySQL 5.5.28 en Ubuntu 12.04

Si el resultado es más largo que group_concat_max_lenentonces, el resultado se trunca sin gracia.

Actualmente tengo un script que intenta verificar la longitud requerida con anticipación y establece group_concat_max_lenque sea lo suficientemente grande.

Pero la comprobación agrega consultas adicionales. ¿Hay alguna desventaja en simplemente establecer group_concat_max_lenel valor máximo? Lo bueno es menos consultas.

Buttle Butkus
fuente
La pregunta parece ser "Si lo configuro demasiado alto, ¿me quedaré sin RAM y me estrellaré, o algo así?". Mientras tanto, 1024 bytes es una cantidad trivial, y parece que no hay necesidad de establecerlo debajo de eso.
Rick James
@RickJames RAM, CPU, etc., sí. "¿La consulta llevará mucho tiempo o utilizará una gran parte de los recursos del sistema?"
Buttle Butkus
1
Pero, si dice 1G, ¿usa inmediatamente 1G, o comienza con un valor pequeño y sube si es necesario?
Rick James
1
Tengo un guión similar. Quería dar cuenta de 1M 32 cadenas de caracteres. Al principio me sorprendió ver que ocupaban 329999999 bytes en el búfer group_concat. La moraleja de esta historia es no olvidar dar cuenta de las comas.
MatrixManAtYrService

Respuestas:

2

Según MySQL BOL aquí

El valor máximo para group_concat_max_lenpara 64 bits es 18446744073709551615

Y

El valor máximo para group_concat_max_lenpara 32 bits es 4294967295

El resultado se trunca a la longitud máxima dada por la group_concat_max_lenvariable del sistema, que tiene un default value of 1024. El valor puede establecerse más alto, aunque la longitud máxima efectiva del valor de retorno está limitada por el valor de max_allowed_packet. La sintaxis para cambiar el valor de group_concat_max_lenat runtimees la siguiente, donde val es an unsigned integer:

SET [GLOBAL | SESSION] group_concat_max_len = val;

Nota: La maximum permittedlongitud del resultado bytespara la GROUP_CONCAT()función. El valor por defecto es 1024.

Como MySQL documentó el blog aquí ¿ Usando GROUP_CONCATcon una group_concat_max_lenconfiguración pequeña ? Su resultado será silently truncated(asegúrese de verificar las advertencias).

Como MySQL Blog by Here : este parámetro limita la longitud del texto de un resultado de concatenación. Por defecto es . Creo que este es un valor muy bajo. He estado usando más y más, recientemente, para resolver problemas que de otra manera serían difíciles. Y en la mayoría de los casos, fue justo , lo que resultó en un truncamiento silencioso (¡Argh!) Del resultado, lo que arrojó resultados incorrectos. Es interesante saber que el valor máximo para este parámetro está limitado por . Sugeriría, entonces, que este parámetro debería eliminarse por completo, y tener como . De lo contrario, me gustaría que tuviera un , del orden de unos pocos .@Shlomi Noach group_concat_max_lenmaximumGROUP_CONCAT1024GROUP_CONCAT1024too lowmax_packet_sizemax_packet_size limitationonly limitationvery large default valueMB

Para más su referencia aquí y aquí

MD Haidar Ali Khan
fuente
Mi pregunta es un poco más matizada y granular. Ya leí el manual, por lo que su trabajo de copiar y pegar no me ayuda. Gracias por el esfuerzo, sin embargo.
Buttle Butkus
@ Buttle Butkus, todas y cada una de las aplicaciones tienen un conjunto de tamaño de parámetro variable de entorno predeterminado, mínimo y máximo. Si no cumple con el límite de parámetro definido, entonces esa aplicación se comportará abruptamente.
Md Haidar Ali Khan
Sí, me gustaría saber sobre el impacto en el rendimiento de cambiar esta configuración. ¿Lograría un gran impacto en TODAS las consultas o solo en aquellas donde se producen grandes concatenaciones?
Buttle Butkus
1
@ButtleButkus, ¿sabe que "SET GLOBAL" significa que la configuración afectará a todas las demás conexiones MySQL en su servidor, y la configuración persistirá incluso después de que termine su sesión actual, hasta que la configure en otra cosa? Es posible que desee utilizar "SET SESSION" si solo desea que el valor afecte a su sesión actual.
Md Haidar Ali Khan
1
Gracias, pero ya sé esas cosas y no tienen nada que ver con mi pregunta.
Buttle Butkus
2

Aprecio que esta pregunta sea un poco antigua ahora, pero en caso de que alguien la encuentre y se pregunte, una desventaja de establecer el valor máximo (o un valor muy grande) es que group_concat puede devolver un blob en lugar de un varchar. Las sugerencias en otros lugares dicen establecer group_concat_max_len en 512 para que siempre devuelva un varchar en lugar de un blob. Sin embargo, tiendo a lanzarlo a char cuando es necesario.

Peter
fuente