sql >> Databáze >  >> RDS >> Mysql

Důvody, proč nepoužívat GROUP_CONCAT?

  • Použití GROUP_CONCAT() obvykle vyvolá logiku skupin podle a vytvoří dočasné tabulky, které jsou obvykle velkým negativem pro výkon. Někdy můžete přidat správný index, abyste se vyhnuli dočasné tabulce v dotazu podle skupiny, ale ne ve všech případech.

  • Jak zdůrazňuje @MarcB, výchozí limit délky řetězce zřetězeného do skupiny je docela krátký a mnoho lidí bylo zmateno zkrácenými seznamy. Limit můžete zvýšit pomocí group_concat_max_len .

  • Rozložení řetězce do pole v PHP není zadarmo. To, že to můžete udělat v jednom volání funkce v PHP, neznamená, že je to nejlepší pro výkon. Rozdíl jsem nezměřil, ale pochybuji, že vy také.

  • GROUP_CONCAT() je MySQLism. Není široce podporován jinými produkty SQL. V některých případech (např. SQLite) mají funkci GROUP_CONCAT(), ale ta nefunguje úplně stejně jako v MySQL, takže to může vést k matoucím chybám, pokud musíte podporovat více back-endů RDBMS. Samozřejmě, pokud se nemusíte starat o přenos, není to problém.

  • Pokud chcete načíst více sloupců ze svých currencies tabulky, pak potřebujete více výrazů GROUP_CONCAT(). Je zaručeno, že seznamy budou ve stejném pořadí? To znamená, že třetí pole v jednom seznamu odpovídá třetímu poli v následujícím seznamu? Odpověď zní ne -- ne, pokud neurčíte objednávku pomocí ORDER BY klauzule uvnitř GROUP_CONCAT().

Obvykle upřednostňuji váš první formát kódu, používám konvenční sadu výsledků a výsledky opakuji, ukládám do nového pole indexovaného podle ID klienta a připojuji měny k poli. Jedná se o přímočaré řešení, díky kterému je SQL jednoduchý a snáze se optimalizuje a funguje lépe, pokud potřebujete načíst více sloupců.

Nesnažím se říct, že GROUP_CONCAT() je špatný! V mnoha případech je to opravdu užitečné. Ale pokusit se vytvořit nějaké univerzální pravidlo pro použití (nebo se vyhnout) jakékoli funkci nebo jazykové vlastnosti je zjednodušující.



  1. Jak vytvořím křížový databázový dotaz v MySQL?

  2. Načíst datový soubor, rozdíl mezi Windows a Linuxem

  3. Odeberte řádek Mysql po zadaném čase

  4. Jak správně zavřít relaci hibernace pomocí serveru mysql