... il codice e' impostato ok, forse gli if all'interno del ciclo, se dovessero nel tempo aumentare i canali ? ...potrebbe essere prevista una tabella di decodifica dei canali con codice e descrizione.

Riguardo al "carico di lavoro" svolto da MySQL server, questo dipende da vari fattori.
Il disegno e normalizzazione delle tabelle, il tipo di engine utilizzato myISAM o innoDB, indici creati ed utilizzati, dichiarazaione di colonne NOT NULL, etc...

La query proposta (in alternativa alle 2 per ogni canale) ha come scopo "primario" quello di semplificare il codice del linguaggio ospite (php) sfruttando le relazioni e le clausole che l'SQL mette a disposizione, e di ottenre l'elenco dei conteggi gia' "bello e confezionato".
... nessuna pretesa di essere particolarmente efficiente

L'ottimizzazione delle Query e' un argomento vasto ed "interessante", del quale (se mi permetti) mi preoccuperei solo dopo aver effettuato test significativi e riscontrato tempi "realmente inaccettabili" delle risposte (tenendo conto anche dei tempi della rete, nelle applicazioni web), cosi' da poter confrontare meglio piu' soluzioni.

Il MySQL, come altri DBMS, ha un suo "optimizer" interno che effettua una "correzione" della query prima che questa venga eseguita, scrivendo i cammini di accesso in maniera piu' ottimizzata.

qui il link dalla guida ufficiale : http://dev.mysql.com/doc/refman/5.0/...imization.html


La query, intesa come istruzione SQL, in questo caso e' una, e le righe "estratte" sono pari al numero delle "provenienze" (una riga per canale).

Qando dici "quante volte esegue la query" presumo che tu voglia riferirti a :
come il motore (myISAM o innoFB) del MySQL effettua lo "scan" per l'estrazione delle righe ("full table scans" o "full index scan"), ovverro se legge tutte le righe in maniera sequenziale o legge l'indice (se presente) relativo alla/e colonne indicate nella clausola WHERE (o fa uso delle sue tabelle interne temporanee)?

La scelta di procedere per la lettura sequenziale o quella per indice, dipende dal volume dei dati, dai valori presenti nelle colonne, dalle colonne che compongono gli indici, etc ....

se ad esempio ho un indice sulla colonna "stato" presente nella WHERE questo e' utilizzato almeno inizialmente, col procedere dello "scan" se il numero di righe che soddisfano la condizione raggiunge una percetuale (se non erro 1/3) rispetto al numero totale, allora il motore continua lo "scan" leggendo in maniera sequenziale.

se scrivo : SELECT count(*) FROM tabella
ed in fase di creazione della tabella ho indicato l'engine MyISAM, la risposta e' immediata, se invece indico l'engine innoDB, impiega piu' tempo (ovviamente con un numero di righe significativo)
Il MyISAM conserva dinamicamente il conteggio delle righe, cosa che non fa il piu' potente ed attuale innoDB. Ci sono dei motivi...

se invece nella SELECT e' presente la clausola WHERE i due "engine" si comportano in maniera del tutto simile...

il count(colonna1) (e' piu' veloce? non so), ha certamente un altro significato rispetto al count(*) se non viene espressa alcuna clausa WHERE su quella colonna :
> "contami tutte righe i cui valori del campo colonna1 siano NOT NULL"
(il campo "provenienza" andrebbe dichiarato come NOT NULL per sicurezza)


... comunque, se proprio dovessi riscontrare tempi "inaccettabili", dacci notizia!