Mysql
 sql >> Database >  >> RDS >> Mysql

Motivi per non utilizzare GROUP_CONCAT?

  • L'uso di GROUP_CONCAT() di solito richiama la logica di raggruppamento e crea tabelle temporanee, che di solito sono un grande aspetto negativo per le prestazioni. A volte puoi aggiungere l'indice giusto per evitare la tabella temporanea in una query raggruppata, ma non in tutti i casi.

  • Come sottolinea @MarcB, il limite di lunghezza predefinito di una stringa concatenata a gruppi è piuttosto breve e molte persone sono state confuse dagli elenchi troncati. Puoi aumentare il limite con group_concat_max_len .

  • L'esplosione di una stringa in un array in PHP non è gratuita. Solo perché puoi farlo in una chiamata di funzione in PHP non significa che sia il migliore per le prestazioni. Non ho confrontato la differenza, ma dubito che tu l'abbia fatto.

  • GROUP_CONCAT() è un MySQLismo. Non è ampiamente supportato da altri prodotti SQL. In alcuni casi (ad es. SQLite), hanno una funzione GROUP_CONCAT(), ma non funziona esattamente come in MySQL, quindi questo può portare a bug confusi se devi supportare più back-end RDBMS. Ovviamente, se non devi preoccuparti del porting, questo non è un problema.

  • Se desideri recuperare più colonne dalle tue currencies tabella, quindi sono necessarie più espressioni GROUP_CONCAT(). Gli elenchi sono garantiti nello stesso ordine? Cioè, il terzo campo in un elenco corrisponde al terzo campo nell'elenco successivo? La risposta è no, a meno che non specifichi l'ordine con un ORDER BY clausola all'interno di GROUP_CONCAT().

Di solito preferisco il tuo primo formato di codice, uso un set di risultati convenzionale e ripeto i risultati, salvandoli in un nuovo array indicizzato dall'ID client, aggiungendo le valute a un array. Questa è una soluzione semplice, mantiene l'SQL semplice e facile da ottimizzare e funziona meglio se hai più colonne da recuperare.

Non sto cercando di dire che GROUP_CONCAT() è cattivo! È davvero utile in molti casi. Ma cercare di stabilire una regola valida per tutti per utilizzare (o evitare) qualsiasi funzione o caratteristica del linguaggio è semplicistico.