Por que definir `group_concat_max_len` abaixo do máximo?

9

MySQL 5.5.28 no Ubuntu 12.04

Se o resultado for maior que group_concat_max_leno resultado, ele será truncado sem graça.

Atualmente, tenho um script que tenta verificar antecipadamente o comprimento necessário e que os conjuntos group_concat_max_lensejam grandes o suficiente.

Mas a verificação adiciona consultas extras. Existe alguma desvantagem em apenas definir group_concat_max_leno valor máximo? A vantagem é menos consultas.

Buttle Butkus
fonte
A pergunta parece ser "Se eu definir muito alto, ficarei sem memória RAM e travarei, ou algo assim?". Enquanto isso, 1024 bytes é uma quantidade trivial e parece não haver necessidade de defini-lo abaixo disso.
Rick James
@ RickJames RAM, CPU, etc, sim. "A consulta levará muito tempo ou consumirá grande parte dos recursos do sistema?"
Buttle Butkus
11
Mas, se você diz 1G, ele usa imediatamente 1G ou começa com um pequeno valor e sobe, se necessário?
Rick James
11
Eu tenho um script semelhante. Eu queria dar conta de 1M de 32 caracteres. A princípio, fiquei surpreso ao ver que eles ocupavam 329999999 bytes no buffer group_concat. A moral desta história é não se esqueça de explicar as vírgulas.
MatrixManAtYrService

Respostas:

2

De acordo com o MySQL BOL aqui

O valor máximo group_concat_max_lenpara 64 bits é 18446744073709551615

&

O valor máximo group_concat_max_lenpara 32 bits é 4294967295

O resultado é truncado para o comprimento máximo fornecido pela group_concat_max_lenvariável do sistema, que possui a default value of 1024. O valor pode ser definido como mais alto, embora o comprimento máximo efetivo do valor de retorno seja limitado pelo valor de max_allowed_packet. A sintaxe para alterar o valor de group_concat_max_lenat runtimeé a seguinte, em que val é um unsigned integer:

SET [GLOBAL | SESSION] group_concat_max_len = val;

Nota: O maximum permittedcomprimento do resultado bytespara a GROUP_CONCAT()função. O padrão é 1024.

Como o MySQL documentou o blog Here Using GROUP_CONCATwith a small group_concat_max_lensetting? Seu resultado será silently truncated(certifique-se de verificar os avisos).

Como Blog do MySQL aqui : Este parâmetro limita o tamanho do texto de um resultado de concatenação. O padrão é . Eu acho que esse é um valor muito baixo. Eu tenho usado cada vez mais, recentemente, para resolver problemas difíceis. E, na maioria dos casos, era justo , resultando em truncamento silencioso (Argh!) Do resultado, retornando resultados incorretos. É interessante saber que o valor máximo desse parâmetro é limitado por . Sugiro, então, que esse parâmetro seja completamente removido e tenha o as as . Caso contrário, eu gostaria que tivesse um , na ordem de alguns .@Shlomi Noach group_concat_max_lenmaximumGROUP_CONCAT1024GROUP_CONCAT1024too lowmax_packet_sizemax_packet_size limitationonly limitationvery large default valueMB

Para mais sua referência aqui e aqui

Md Haidar Ali Khan
fonte
Minha pergunta é um pouco mais sutil e granular. Já li o manual para que seu trabalho de copiar e colar não me ajude. Obrigado pelo esforço, no entanto.
Buttle Butkus
@ Bututus Butkus, Todos os aplicativos têm algum conjunto de tamanho de parâmetro de variável de ambiente padrão, min e max.se você não atender lá, defina o limite do parâmetro de limite, então esse aplicativo se comportará de maneira abrupta.
Md Haidar Ali Khan
Sim, eu gostaria de saber sobre o impacto no desempenho de alterar essa configuração. Fazer com que isso impactasse TODAS as consultas ou apenas aquelas em que ocorrem grandes concatenações?
Buttle Butkus
11
@ButtleButkus, você sabe que "SET GLOBAL" significa que a configuração afetará todas as outras conexões MySQL no seu servidor, e a configuração ainda persistirá após a conclusão da sua sessão atual, até que você a configure para outra coisa? Você pode usar "SET SESSION" se desejar que o valor afete apenas a sua sessão atual.
Md Haidar Ali Khan /
11
Obrigado, mas eu já sei essas coisas e elas não têm nada a ver com a minha pergunta.
Buttle Butkus
2

Eu aprecio que essa pergunta seja um pouco antiga agora, mas, caso alguém a encontre e esteja se perguntando, uma desvantagem de definir o valor máximo (ou um valor muito grande) é que group_concat pode retornar um blob em vez de um varchar. Sugestões em outros lugares dizem para definir group_concat_max_len como 512 para sempre retornar um varchar em vez de um blob. Eu costumo lançá-lo no char quando necessário.

Pedro
fonte