[MontelLUG] Query mysql e velocità: cercasi consigli

Andrea Della Regina manichen a gmail.com
Lun 10 Gen 2011 20:35:04 CET


Il 10 gennaio 2011 18:16, Daneel Olivaw <daneel.olivaw.r a gmail.com> ha scritto:
[...]

> Dopo aver fatto la parte più ardua, cioè creare l'avviso per la
> mancanza di risultati, sono arrivato a quella più tennica: stabilire
> nel modo più veloce se c'è qualcosa da elaborare.
>
> Ci sono 3 strade (o almeno queste sono quelle a cui sono arrivato io):
> 1) fare un "select * [condizioni, ecc.]", mettere i risultati in
> un'array o simile e se non vuota andare avanti con la fase di gestione
> dei dati, altrimenti "Gnè gnè";
>  - vantaggi: si fa la guery una volta sola, se dà risultato positivo
> bene, altrimenti amen;
>  - svantaggi: se l'esito è positivo, bisogna attendere il
> completamento della query prima di poter passare alla fase successiva;

Adottare questa tecnica va bene, dipende da come ti trovi meglio con
il linguaggio di programmazione da cui esegui la query. Considera che
dopo una query in genere è possibile facilmente ricavare da API o cose
simili il numero di righe estratte, quindi se la query restituisce 0
righe puoi fare il messaggio di dati assenti.

In merito al controllo con la query "SELECT COUNT(*) FROM table"
bisogna fare alcune considerazioni inerenti alle performance.

1) Se la tabella TABLE è creata come InnoDB le query con COUNT(*) sono
molto più lente rispetto al caso in cui fosse creata come tabella
MyISAM (http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/)
2) Nel caso di una query con COUNT(*) su una tabella MyISAM,
l'ottimizzatore di MySQL converte questo dato nel numero di record
della tabella che è pre-calcolato e quindi molto veloce, invece se si
scrive un COUNT(col) e la colonna COL è NULLABLE allora il DB dovrà
effettuare un FULL TABLE SCAN, con ricadute notevoli sulle prestazioni
(http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/)

Detto questo, io in genere preferisco fare:
SELECT 1 FROM table LIMIT 1

L'effetto è di restituire niente se la tabella è vuota, oppure 1,
senza applicare nessun tipo di ordinamento, filtro, conversione etc.,
basandosi solo sull'indice primario se presente, quindi ha un peso
minimo per il DB, diciamo che ha costo 1.
[...]


Ciao,
Andrea

-- 
Andrea Della Regina - manichen a gmail.com
"Fonder des bibliothèques, c'étais encore construire des greniers
publics, amasser des réserves contre un hiver de l'esprit, qu'à
certains signes, malgré moi, je vois venir." M. Yourcenar, Mémoires
d'Hadrien




More information about the montellug mailing list