[Db] prestazioni mysql

Marcello Vezzelli marcello a vezz.it
Mar 31 Lug 2007 10:54:20 CEST


Ciao a tutti,
ho una tabella fatta circa in questo modo...

CREATE TABLE `mov` (
  `id` int(11) NOT NULL auto_increment,
  `data` date NOT NULL,
  `descr` varchar(100) collate latin1_general_ci default NULL,
  `rif_cassa_src` int(11) NOT NULL default '0',
  `rif_cassa_dst` int(11) NOT NULL default '0',
  `importo` double NOT NULL default '0',
  `rif_distinta` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `data` (`data`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Questa tabella contiene movimenti tra 12 casse: l'importo viene spostato 
dalla rif_cassa_src alla rif_cassa_dst.
Come si vede, c'è un indice sul campo 'data'.

Nel software di gestione che sto scrivendo, ho circa 90 movimenti di 
questo tipo al giorno.

Siccome ho necessità di tener traccia del saldo di tutte e 12 le casse 
con frequenti aggiornamenti, ricalcolando ogni volta i saldi, mi è 
venuto il dubbio che a lungo andare la faccenda potesse diventare pesante...
Ho fatto allora una simulazione con 100.000 record (sono oltre 3 anni di 
dati) e una query di questo tipo:

SELECT (
    (SELECT SUM(importo) FROM mov WHERE rif_cassa_dst=1 AND data 
<='2007-07-31') -
    (SELECT SUM(importo) FROM mov WHERE rif_cassa_src=1 AND data 
<='2007-07-31')
) as saldo;

Questa query viene eseguita in 0.12 secondi.
Sono rimasto positivamente colpito da questo risultato... me 
l'aspettavo, ma è bello vedere che le cose funzionano bene!

Quando ho un po' di tempo, voglio fare qualche test aggiuntivo 
aggiungendo un indice sui riferimenti di cassa, per vedere cosa cambia 
(se cambia qualcosa).

Secondo voi c'è modo di ottenere performance ancora migliori con una 
struttura simile?

Saluti
Marcello



Maggiori informazioni sulla lista Db