Perché impostare `group_concat_max_len` al di sotto del massimo?


9

MySQL 5.5.28 su Ubuntu 12.04

Se il risultato è più lungo di group_concat_max_lenallora, il risultato viene troncato senza grazia.

Attualmente ho uno script che cerca di verificare in anticipo la lunghezza richiesta e group_concat_max_lenche è sufficientemente grande.

Ma il controllo aggiunge ulteriori domande. C'è qualche svantaggio di impostare group_concat_max_lenil valore massimo? Il lato positivo è che ci sono meno domande.


La domanda sembra essere "Se l'ho impostato troppo alto, rimarrò a corto di RAM e crash, o qualcosa del genere?". Nel frattempo, 1024 byte è un valore insignificante e sembra che non sia necessario impostarlo al di sotto di quello.
Rick James,

@RickJames RAM, CPU, ecc. Sì. "La query richiederà molto tempo o consumerà gran parte delle risorse di sistema?"
Buttle Butkus,

1
Ma, se dici 1G, usa immediatamente 1G o inizia con un valore ridotto e sale se necessario?
Rick James,

1
Ho una sceneggiatura simile. Volevo rappresentare stringhe di caratteri 1M 32. Sono stato inizialmente sorpreso di vedere che occupavano 329999999 byte nel buffer group_concat. La morale di questa storia è non dimenticare di rendere conto delle virgole.
MatrixManAtYrService

Risposte:


2

Come da MySQL BOL qui

Il valore massimo per group_concat_max_lenper 64 bit è 18446744073709551615

&

Il valore massimo per group_concat_max_lenper 32 bit è 4294967295

Il risultato viene troncato alla lunghezza massima fornita dalla group_concat_max_lenvariabile di sistema, che ha un default value of 1024. Il valore può essere impostato su un valore più alto, sebbene la lunghezza massima effettiva del valore restituito sia vincolata dal valore di max_allowed_packet. La sintassi per modificare il valore di group_concat_max_lenat runtimeè la seguente, dove val è un unsigned integer:

SET [GLOBAL | SESSION] group_concat_max_len = val;

Nota: la maximum permittedlunghezza del risultato in bytesper la GROUP_CONCAT()funzione. L'impostazione predefinita è 1024.

Come documentato nel blog di MySQL qui Usando GROUP_CONCATcon una piccola group_concat_max_lenimpostazione? Il risultato sarà silently truncated(assicurati di controllare gli avvisi però).

Come MySQL Blog di Here : questo parametro limita la lunghezza del testo di un risultato di concatenazione. L'impostazione predefinita è . Penso che questo sia un valore molto basso. Recentemente ho usato sempre di più per risolvere problemi altrimenti difficili. E nella maggior parte dei casi, era giusto , provocando il troncamento silenzioso (Argh!) Del risultato, restituendo così risultati errati. È interessante apprendere che il valore massimo per questo parametro è limitato da . Suggerirei quindi che questo parametro debba essere rimosso del tutto e che abbia come . Altrimenti, mi piacerebbe avere un , nell'ordine di pochi .@Shlomi Noach group_concat_max_lenmaximumGROUP_CONCAT1024GROUP_CONCAT1024too lowmax_packet_sizemax_packet_size limitationonly limitationvery large default valueMB

Per ulteriori informazioni, qui e qui


La mia domanda è un po 'più sfumata e granulare. Ho già letto il manuale, quindi il tuo lavoro di copia e incolla non mi aiuta. Grazie per lo sforzo, però.
Buttle Butkus,

@Buttle Butkus, Ogni singola applicazione ha un set di dimensioni dei parametri delle variabili di ambiente predefinite, min e max. Se non ci si incontra, definire il limite del parametro di soglia, quindi l'applicazione si comporta bruscamente.
Haidar Ali Khan,

Sì, vorrei conoscere l'impatto sulle prestazioni della modifica di questa impostazione. Avrebbe un grande impatto su TUTTE le query o solo su quelle in cui si verificano grandi concatenazioni?
Buttle Butkus,

1
@ButtleButkus, sai che "SET GLOBAL" significa che l'impostazione avrà effetto su tutte le altre connessioni MySQL sul tuo server e che l'impostazione persisterà anche al termine della sessione corrente, fino a quando non la imposti su qualcos'altro? È possibile che si desideri utilizzare "SET SESSION" se si desidera che il valore influisca solo sulla sessione corrente.
Haidar Ali Khan,

1
Grazie, ma conosco già quelle cose e non hanno nulla a che fare con la mia domanda.
Buttle Butkus,

2

Apprezzo che questa domanda sia un po 'vecchia ora, ma nel caso in cui qualcuno la trovi e si stia chiedendo, un aspetto negativo dell'impostazione del valore massimo (o altrimenti molto grande) è che group_concat può restituire un blob anziché un varchar. Suggerimenti suggeriscono altrove di impostare group_concat_max_len su 512 in modo da restituire sempre un varchar anziché un BLOB. Tendo a lanciarlo solo in caratteri, se necessario, però.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.