Portál AbcLinuxu, 30. dubna 2025 12:46
HostnameLookups
jste měli nakonec pravdu nakonec vy. Původní příčina byla zapnutém firewallu ve Fedoře 15, u něhož se mi nepodařilo jeho zakázání obvyklým příkazem chkconfig, díky novém systemd. Za druhé se chci ale zamyslet na výše uvedeným příkazem v MySQL.
Na první pohled se totiž jedná o velice užitečný příkaz, který zřetězí pomocí zadaného oddělovače záznamy zesumarizované pomocí GROUP BY
. Hodit se může např. v případě, že GROUP
ujeme např. podle uživatelského jména a chceme zjistit jestli v DB není jméno duplikované, takže si pomocí GROUP CONCAT(user_id) AS uid
vypíšeme např.:
user1 | 14,21,35 filbar | 22,675 . . . atd.Jenomže to má jeden dooooost podstatný háček, velikost vráceného řetězce je ve výchozím stavu omezena na POUHÝCH 1024 znaků (přenastavit se dá v konfigu). Nechápu k čemu vůbec toto omezení existuje :-O. To má sloužit jako nějaká optimalizace, nebo proč? V každém případě nechápu proč vývojaři MySQL takto užitečnou funkci tak zbytečně pokazili. BTW. Než jsem to dneska odpoledne odhalil, tak jsem ztratil dobré 2 hodiny času.
Tiskni
Sdílej:
Hodit se může např. v případě, že GROUPujeme např. podle uživatelského jména a chceme zjistit jestli v DB není jméno duplikované
To můžete zjistit snáz třeba pomocí
select NAME,count(ID) as CNT from TT group by NAME having COUNT(ID)>1
nebo (lépe) rovnou ten sloupec deklarovat jako unique.
Jenomže to má jeden dooooost podstatný háček, velikost vráceného řetězce je ve výchozím stavu omezena na POUHÝCH 1024 znaků (přenastavit se dá v konfigu). Nechápu k čemu vůbec toto omezení existuje :-O. To má sloužit jako nějaká optimalizace, nebo proč?
Zřejmě to bude souviset s implementací té agregační funkce a její návratové hodnoty. Na druhou stranu, pokud vám taková délka nestačí, je více než pravděpodobné, že to, o co se snažíte, bude vhodnější dělat úplně jinak. Tahle agregační funkce slouží k usnadnění práce při generování jednoduchých výpisů, ne k tomu, abyste pomocí ní lámal něco, co pravděpodobně půjde daleko lépe vyřešit nějakým joinem.
SET SESSION group_concat_max_len = xx;
odit se může např. v případě, že GROUPujeme např. podle uživatelského jména a chceme zjistit jestli v DB není jméno duplikované, takže si pomocí GROUP CONCAT(user_id) AS uid vypíšeme např.:No nevím, nějaký index, nebo něco podobného by asi bylo mnohem rozumnější, než to řešit na aplikační úrovni...
You can set a maximum allowed length with the group_concat_max_len system variable. (The default value is 1024.)Osobne bych duplicity taky radsi hledal spis pomoci
having
.
Co se tyce MySQL, muj osobni pocit je ze blysti se tam toho hodne, ale zlata je tam asi jak v Ankh-Morporskem tolaru :)
Za posledni 1/2 rok sem stravil neuveritelne mnozstvi casu prochazenim manualu MySQL ve snaze vyresit ruzne veci. Vetsina featur MySQL se nese v tomto duchu: "MySQL ve verzi X ma novou skvelou featuru Y. .... nasleduje popis featury .... prosim prectete si omezeni tedle featury tady ..." a link na trikrat delsi popis omezeni featury.
Priklad co sem resil: mam tabulku a protoze bude mit moc radku (v radech milionu) chci udelat partitioning. Tabulka "t", primarni klic "id" auto increment, cizi klic "y_id", foreign key constraint nad y_id, par dalsich sloupcu.
Ja: create table... partition by list(y_id)
MySQL: partition tabulka nemuze mit foreign key constraint
Ja: ok, cert vem integritu, znovu bez foreign key
MySQL: kazdy sloupec z partition key musi byt soucast primary key.
Ja: WTF ? co je todle za .... ? no nic tak udelam slozeny primary key (y_id, id)
MySQL: Nemuzete mit auto_increment nad jednim sloupcem slozeneho primary key
Ja: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
... Kdyz nechcete prijit o nervy, vyhnete se MySQL obloukem.
Kdybys v druhém kroku vyhodil místo foreign key onu partition část, tak bys měl po problému.Podstata cviceni byla zavest partitioning. Zkouseli ste nekdy vymazat 5M radku z tabulky co jich ma 25M ? Kdyz je mate v partitionech, dropnuti jedne partition je prakticky okamzite.
A nebo jsi to prostě jen dělal blběNemyslim. AFAIK vsechno na co sem narazil jsou dokumentovane omezeni, neboli gotcha
SELECT
em, když ho napíšu špatně.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.