为什么将group_concat_max_len设置为最大值以下?


9

Ubuntu 12.04上的MySQL 5.5.28

如果结果长于该时间,group_concat_max_len则结果将被优雅地截断。

当前,我有一个脚本,该脚本试图提前检查所需的长度并将其设置group_concat_max_len为足够大。

但是检查增加了额外的查询。设置group_concat_max_len为最大值有什么弊端?好处是更少的查询。


问题似乎是“如果我将它设置得太高,我会用完RAM并崩溃吗?”。同时,1024字节是微不足道的数量,似乎没有必要将其设置为低于该数量。
里克·詹姆斯

@RickJames RAM,CPU等,是的。“查询会花费很长时间还是会消耗大量系统资源?”
Buttle Butkus

1
但是,如果您说1G,它会立即使用1G,还是从一个很小的值开始并在需要时逐步提高?
瑞克·詹姆斯

1
我有一个类似的脚本。我想考虑1M 32个字符串。最初让我感到惊讶的是,它们在group_concat缓冲区中占用了329999999个字节。这个故事的寓意是不要忘记解释逗号。
MatrixManAtYrService

Answers:


2

根据MySQL BOL 在这里

group_concat_max_len64位的最大值是 18446744073709551615

group_concat_max_len32位的最大值是 4294967295

结果被截断为group_concat_max_len系统变量给定的最大长度,该最大长度为default value of 1024。尽管返回值的有效最大长度受的值限制,但可以将值设置得更高max_allowed_packet。更改group_concat_max_lenat 的值的语法runtime如下,其中val是一个unsigned integer

SET [GLOBAL | SESSION] group_concat_max_len = val;

注:maximum permitted在结果长度bytesGROUP_CONCAT()函数。默认值为1024

正如MySQL所记录的博客此处使用GROUP_CONCAT小的group_concat_max_len设置?您的结果将是silently truncated(但请务必检查警告)。

如MySQL Blog by Here:此参数限制连接结果的文本长度。默认为。我认为这是一个非常低的价值。最近,我一直在使用越来越多的方法来解决其他棘手的问题。并且在大多数情况下,just 导致结果被静音(Argh!)截断,从而返回错误的结果。有趣的是,此参数的最大值受限制。那么,我建议应完全删除此参数,并将其作为。否则,我希望它的数量为几个。@Shlomi Noach group_concat_max_lenmaximumGROUP_CONCAT1024GROUP_CONCAT1024too lowmax_packet_sizemax_packet_size limitationonly limitationvery large default valueMB

进一步的参考这里这里


我的问题是更细微和精细的。我已经阅读过该手册,因此您的复制粘贴作业对我没有帮助。不过,感谢您的努力。
Buttle Butkus

@Buttle Butkus,每个应用程序都有一组默认的环境变量参数大小(最小值和最大值),如果您不符合定义阈值参数的限制,则该应用程序会突然表现出来。
海达尔·阿里汗

是的,我想了解更改此设置对性能的影响。它将对所有查询产生重大影响,还是仅对发生较大串联的查询产生重大影响?
Buttle Butkus

1
@ButtleButkus,您知道“ SET GLOBAL”意味着该设置将影响服务器上的所有其他MySQL连接,并且该设置甚至会在当前会话完成后继续存在,直到您将其设置为其他设置为止?如果只希望该值影响当前会话,则可能要使用“ SET SESSION”。
海达尔·阿里汗

1
谢谢,但是我已经知道这些事情,它们与我的问题无关。
Buttle Butkus

2

我知道这个问题现在有点老了,但是如果有人发现它并且想知道,设置最大值(否则非常大)的一个缺点是group_concat可以返回blob而不是varchar。其他地方的建议说将group_concat_max_len设置为512,以使其始终返回varchar而不是blob。我倾向于在必要时将其转换为char。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.