Università degli Studi di Modena e Reggio Emilia Facoltà di Scienze della Comunicazione e dell Economia Corso di Laurea in Comunicazione e Marketing Anno Accademico 2005/06 Metodi per la Gestione dei Dati (lezioni di laboratorio) Titolare del corso: ing. Stefano SETTI Lezioni di laboratorio: gruppo A-K - dott. Fabio RUINI gruppo M-Z - dott. Alessandro FILISETTI 1
Il programma di oggi Ottimizzazione delle procedure attraverso l introduzione di indici (creazione di tabelle con indici, aggiunta di indici alle tabelle, comparazione dei risultati con indici e senza indici) Esercitazioni Chiarimenti di varia natura 2
Ottimizzazione I dati di un database sono contenuti all interno del disco fisso e le operazioni di inserimento e aggiornamento consistono di una serie di operazioni di input/output (I/O) sul disco. Ottimizzare una query SQL significa ridurre al minimo il numero di operazioni di I/O 3
Gli indici L arma principale per ottimizzare le query sono gli indici Analizziamo questa query: SELECT nome FROM Dipendente WHERE codfis = ABCDFG66A31Z999M In che modo il nostro database recupera il dato cercato? 4
Gli indici -2- Procedura standard -> MySQL passerà attraverso tutti i record della tabella fino al ritrovamento del valore contenuto nella clausola WHERE Se avessimo ad esempio 1.000.000 di record? 5
Gli indici -3- Attribuendo un indice su di un dato attributo MySQL prima di eseguire la query vera e propria farà un ordinamento su quell attributo e la ricerca del record potrà poi avvenire in modalità dicotomica Attraverso una ricerca standard su 1.000.000 avremmo una media di 500.000 (N/2) operazioni di I/O Attraverso una ricerca dicotomica (basata sugli indici) su 1.000.000 avremmo al massimo log2 N = circa 20 6
Gli indici -4- Per creare un indice su di una relazione esistente si esegue il seguente comando (Es. Vogliamo attribuire un indice sull attributo codice_fiscale all interno della relazione agente) mysql> ALTER TABLE `agente` ADD INDEX ( `codice_fiscale` ) 7
Gli indici -5- Fare click qui Lo stesso comando in PhpMyAdmin 8
Gli indici -6- Per creare un indice su di una tabella in fase di creazione della stessa ) mysql> CREATE TABLE `agente` ( `matricola` char(3) NOT NULL default '', `codice_fiscale` varchar(16) NOT NULL default '', `nome` varchar(20) NOT NULL default '', `cognome` varchar(20) NOT NULL default '', PRIMARY KEY (`matricola`), KEY `codice_fiscale` (`codice_fiscale`) 9
Gli indici -6- Fare click qui La stessa operazione in PhpMyAdmin 10
Connessione a MySQL step 1 Una volta entrati nel prompt dei comandi, occorre spostarsi all interno della directory nella quale è stato installato il client. Se durante l installazione non sono stati variati i parametri di default, per accedere alla cartella dovrebbe essere sufficiente digitare l istruzione: C:\>cd \Programmi\EasyPHP1-8\mysql\bin seguita dalla pressione del tasto INVIO 11
Connessione a MySQL step 2 Per comodità possiamo accedere a MySQL con le credenziali di root : C:\Programmi\EasyPHP1-8\mysql\bin\>mysql u root (il parametro -u indica a MySQL che la stringa seguente rappresenta il nome dell utente che sta tentando di collegarsi al DBMS). 12
Interrogazioni ad una tabella 13
Query 1 Visualizzare il numero delle contravvenzioni elevate. mysql> select count(*) from infrazione; 14
Query 2 Visualizzare la targa delle automobili a cui sono state elevate contravvenzioni (senza che vi sia, nell output, la stessa targa ripetuta più volte). mysql> select distinct(targa) from infrazione; 15
Query 3 Visualizzare il numero di infrazioni contestate nel corso dell anno 2004. mysql> select count(*) as infrazioni elevate nell anno 2004 from infrazione where data like 2004% ; 16
Interrogazioni su due tabelle 17
Query 4 Visualizzare il proprietario dell auto a cui è stata elevata una contravvenzione il 25 maggio 2005. mysql> select proprietario from infrazione i, auto a where i.targa = a.targa and i.data = 2005-05-25 ; = Ridenominatori di relazione mysql> select proprietario from infrazione as i, auto as a where i.targa = a.targa and i.data = 2005-05-25 ; 18
Query 5 Visualizzare nome e cognome degli agenti che hanno elevato contravvenzioni nel corso dell anno 2004. mysql> select a.nome as nome agente, a.cognome as cognome agente from agente a, infrazione i where a.matricola = i.agente and i.data like 2004% group by a.matricola; 19
Query 6 Visualizzare l elenco degli articoli infranti da Luca Bini. mysql> select distinct(i.articolo) as articoli infranti from infrazione i, auto a where i.targa = a.targa and a.proprietario = Luca Bini ; 20
Interrogazioni su tre tabelle 21
Query 7 Visualizzare numero di matricola, nome e cognome dell agente che, in data 26 ottobre 2004, ha elevato una contravvenzione a Piero Verdi. mysql> select ag.matricola, ag.nome, ag.cognome from agente ag, infrazione i, auto a where i.targa = a.targa and i.agente = ag.matricola and a.proprietario = Piero Verdi and i.data = 2004-10-26 ; 22
Query 8 Visualizzare nome ed indirizzo di tutti coloro a cui l agente Luigi Neri ha elevato contravvenzioni nel corso dell ottobre 2004. mysql> select a.proprietario, a.indirizzo from agente ag, infrazione i, auto a where i.targa = a.targa and i.agente = ag.matricola and ag.nome = Luigi and ag.cognome = Neri and i.data like 2004% ; 23
Query 9 Visualizzare il codice fiscale degli agenti che hanno elevato contravvenzioni a Luca Bini. mysql> select ag.codice_fiscale from agente ag, infrazione i, auto a where i.targa = a.targa and i.agente = ag.matricola and a.proprietario = Luca Bini ; 24
Fine della sesta lezione 25