Зачем устанавливать `group_concat_max_len` ниже максимума?

9

MySQL 5.5.28 в Ubuntu 12.04

Если результат длиннее, чем group_concat_max_lenрезультат, результат будет изящно усечен.

В настоящее время у меня есть скрипт, который пытается проверить требуемую длину заранее и устанавливает group_concat_max_lenдостаточно большой размер .

Но проверка добавляет дополнительные запросы. Есть ли недостаток в том, чтобы просто установить group_concat_max_lenмаксимальное значение? Преимущество - меньше запросов.

Баттл Буткус
источник
Похоже, вопрос звучит так: «Если я установлю его слишком высоко, у меня закончится память и произойдет сбой или что-то в этом роде?». Между тем, 1024 байта - это тривиальная сумма, и, кажется, нет необходимости устанавливать ее ниже этого значения.
Рик Джеймс
@RickJames RAM, CPU и т. Д., Да. «Запрос займет много времени или израсходует большую часть системных ресурсов?»
Баттл Буткус
1
Но, если вы скажете 1G, будет ли он сразу использовать 1G, или он начнет с небольшого значения и, если нужно, будет двигаться вверх?
Рик Джеймс
1
У меня есть похожий сценарий. Я хотел учесть 1M 32 строки символов. Сначала я удивился, увидев, что они занимают 329999999 байт в буфере group_concat. Мораль этой истории - не забывайте учитывать запятые.
MatrixManAtYrService

Ответы:

2

В соответствии с MySQL BOL здесь

Максимальное значение group_concat_max_lenдля 64-битного 18446744073709551615

&

Максимальное значение group_concat_max_lenдля 32-битного 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результата bytesдля GROUP_CONCAT()функции. По умолчанию это 1024.

Как MySQL документировал блог здесь, используя GROUP_CONCATнебольшой group_concat_max_lenпараметр? Ваш результат будет silently truncated(обязательно проверьте предупреждения).

As MySQL Blog by Here : Этот параметр ограничивает длину текста результата конкатенации. По умолчанию оно . Я думаю, что это очень низкая стоимость. В последнее время я все больше и больше использую для решения сложных проблем. И в большинстве случаев было просто , что приводило к тихому (Argh!) Усечению результата, возвращая таким образом неверные результаты. Интересно узнать, что максимальное значение этого параметра ограничено . Тогда я бы предложил, чтобы этот параметр был полностью удален и имел значение как . В противном случае, я бы хотел, чтобы это было в порядке нескольких .@Shlomi Noach group_concat_max_lenmaximumGROUP_CONCAT1024GROUP_CONCAT1024too lowmax_packet_sizemax_packet_size limitationonly limitationvery large default valueMB

Для дальнейшей вашей ссылки здесь и здесь

Г-н Хайдар Али Хан
источник
Мой вопрос немного более детальный и детальный. Я уже прочитал руководство, поэтому твоя работа по копированию и вставке мне не поможет. Спасибо за усилия, хотя.
Баттл Буткус
@Buttle Butkus, у каждого приложения есть некоторый набор размера параметров переменной среды по умолчанию, min и max. Если вы не встретите там, определите пороговый предел параметра, тогда это приложение ведет себя неожиданно.
Г-н Хайдар Али Хан
Да, я хотел бы знать о влиянии производительности на изменение этого параметра. Повлияет ли это на ВСЕ запросы или только на те, где происходят большие конкатенации?
Баттл Буткус
1
@ButtleButkus, вы знаете, что «SET GLOBAL» означает, что настройка будет влиять на все другие соединения MySQL на вашем сервере, и настройка будет сохраняться даже после завершения текущего сеанса, пока вы не установите его на что-то другое? Возможно, вы захотите использовать «SET SESSION», если хотите, чтобы значение влияло только на ваш текущий сеанс.
Г-н Хайдар Али Хан
1
Спасибо, но я уже знаю эти вещи, и они не имеют никакого отношения к моему вопросу.
Баттл Буткус
2

Я ценю, что этот вопрос уже немного устарел, но в случае, если кто-то найдет его и задается вопросом, одним из недостатков установки максимального (или очень большого) значения является то, что group_concat может возвращать blob, а не varchar. В других предложениях сказано, что для group_concat_max_len нужно 512, чтобы он всегда возвращал varchar, а не blob. Я имею тенденцию просто бросать это к символу, где необходимо все же.

Питер
источник