francesco.chianese
pubblicato più di 2 anni fa

Introduzione agli indici

L’articolo descrive un introduzione agli indici proponendo esempi su come creare e come rimuovere indici su tabelle MySQL

Gli indici di una tabella sono degli oggetti definiti su uno o più campi, che consentono di velocizzare la ricerca e l’ordinamento dei dati della data tabella, secondo il campo o i campi per cui è definito. In un database reale, infatti, il numero di record di una tabellà può diventare veramente molto grande, anche milioni.

Ciò rende sempre più lento il reperimento di dati ed informazioni, in quanto il DBMS deve gestire un quantitativo di “BIT” veramente enorme. In altre parole deve scorrere tutta la tabella, finché non trova il dato di interesse. Per risolvere questa problematica, e quindi velocizzare la ricerca dei dati su una tabella, è possibile ricorrere agli indici. Gli indici, come le tabelle, sono memorizzati in un file contenenti puntatori, ovvero gli indirizzi, dei dati sulla tabella. p<>. Quando sono utilizzati gli indici, la ricerca di un dato risulta essere molto più veloce, in quanto il DBMS si occupa, prima di reperire l’indice del dato che si sta cercando, e successivamente, accede al file contenente i dati in tabella, già sapendo in quale posizione andare a reperire le informazioni. E’ evidente che, in presenza di tabelle molto grandi, gli indici riducono drasticamente i tempi di ricerca, migliorando le prestazioni della nostra base dati.

MySQL supporta quattro tipi di indici:

  1. Indici non unici, che consentono la presenza di dati duplicati
  2. Indici unici, che non consentono la presenza di dati duplicati
  3. Chiavi primarie, che non consentono valori duplicati e valori nulli
  4. Fulltext, utilizzati per velocizzare la ricerca di testi

Gli indici di una tabella possono essere creati sia in fase di creazione della tabella stessa, che in fase di modifica. Ad esempio, supponiamo di voler creare una tabella Studente con i campi Matricola, Nome, Cognome, Esame, Voto, e di voler definire il campo Matricola come chiave primaria della tabella, e il campo Cognome come indice della tabella stessa. In questo caso la query da scrivere sarà la seguente.

 1CREATE TABLE Studente (
 2              Matricola INT(10),
 3              Nome VARCHAR(40),
 4              Cognome VARCHAR(40),
 5              Esame VARCHAR(40),
 6              Voto INT(2),
 7              PRIMARY KEY(Matricola),
 8              INDEX(Cognome)
 9              );

Il comando che è stato utilizzato per definire il campo cognome come indice è ovviamente INDEX. In questo modo si rende molto più veloce non solo l’accesso in tabella attraverso la chiave primaria, ma anche attraverso il campo Cognome. Oltre al comando INDEX, per definire un indice si può ricorrere indifferentemente anche alla parola chiave KEY. Di conseguenza, la query di seguito è del tutto identica alla precedente.

 1CREATE TABLE Studente (
 2              Matricola INT(10),
 3              Nome VARCHAR(40),
 4              Cognome VARCHAR(40),
 5              Esame VARCHAR(40),
 6              Voto INT(2),
 7              PRIMARY KEY(Matricola),
 8              KEY(Cognome)
 9              );

E’ possibile ovviamente inserire anche un indice riferito a più campi. Ad esempio supponiamo che alla tabella studente, oltre all’indice Cognome, vogliamo aggiungere un altro indice legato ai campi Nome e Cognome. In questo caso, bisognerà ricorrere al comando ALTER TABLE sulla tabella di interesse e poi ricorrere alla clausola ADD seguita dal tipo di indice che si vuole creare. Nel nostro caso la query da utilizzare è la seguente

1ALTER TABLE Studente
2ADD INDEX(Nome, Cognome);

Gli indici che abbiamo creato, seguendo la sequenza che abbiamo indicato sopra, sono degli indici del primo tipo, in quanto consentono l’inserimento per i campi Nome e Cognome di dati duplicati. Qualora volessimo creare degli indici che non devono essere duplicati bisogna ricorrere alla clausola UNIQUE. Quindi, supponiamo di voler creare la tabella studente avente come unico indice il campo matricola, con tale indice che non deve presentare duplicati. In questo caso la query da creare sarà la seguente

1CREATE TABLE Studente (
2              Matricola INT(10) NOT NULL,
3              Nome VARCHAR(40),
4              Cognome VARCHAR(40),
5              Esame VARCHAR(40),
6              Voto INT(2),
7              UNIQUE(Matricola)
8              );

Osserviamo che in questo caso, anche se non abbiamo dichiarato il campo matricola esplicitamente come chiave primaria per la tabella studente, esso si comporta proprio una chiave primaria. Infatti, col comando NOT NULL, applicato in fase di creazione del campo matricola, abbiamo impedito che possano essere inseriti dei record in tabella che abbiano quel campo nullo. Inoltre, avendolo definito come indice unico, abbiamo fatto in modo che per quel campo non possano esserci duplicati, comportandosi di fatto come chiave primaria. C’è da dire inoltre, che se l’indice unico è composto da un solo campo, esso può essere definito direttamente nella fase di creazione del campo stesso. Quindi la query di prima risulta analoga alla seguente.

1CREATE TABLE Studente (
2              Matricola INT(10) NOT NULL UNIQUE,
3              Nome VARCHAR(40),
4              Cognome VARCHAR(40),
5              Esame VARCHAR(40),
6              Voto INT(2)
7              );

Osserviamo che agli indici creati in precedenza non è mai stato dato un nome. Quando non viene associato un nome ad un indice, MySQL vi assegna come nome di default il primo nome dei campi che afferiscono a quell’indice. Quindi, nei casi precedenti, all’indice contenente il campo Cognome, MySQL vi associa di default il nome ‘Cognome’, mentre all’indice costituito dai campi Nome e Cognome, MySQL vi associa il nome ‘Nome’. Qualora volessimo associare un nome ad un indice in fase di creazione, dobbiamo inserire tale nome dopo la clausola KEY o INDEX, e prima della dichiarazione dei campi che compongono tale l’indice. Ad esempio, se in fase di creazione della tabella studente l’indice associato al campo Cognome vogliamo chiamarlo Last_Name, la query da eseguire sarà la seguente:

 1CREATE TABLE Studente (
 2              Matricola INT(10),
 3              Nome VARCHAR(40),
 4              Cognome VARCHAR(40),
 5              Esame VARCHAR(40),
 6              Voto INT(2),
 7              PRIMARY KEY(Matricola),
 8              KEY Last_Name (Cognome)
 9              );

Qualora invece di inserire un indice volessimo eliminarlo da una tabella, l’istruzione da utilizzare è DROP seguito dal nome dell’indice da eliminare. Quando non si conosce il nome dell’indice da eliminare, possiamo procedere alla seguente maniera. Supponiamo di avere a database una tabella studente e di non conoscere gli indici di questa tabella. Per visualizzare gli indici ricorriamo al comando SHOW CREATE TABLE. Nel nostro caso sarà:

1SHOW CREATE TABLE Studente

La query fornisce il seguente risultato, che altro non è che tutto il codice SQL associato alla tabella studente creata.

 1'Studente', CREATE TABLE 'studente' (
 2  'Matricola' int(10) NOT NULL DEFAULT '0',
 3  'Nome' varchar(40) DEFAULT NULL,
 4  'Cognome' varchar(40) DEFAULT NULL,
 5  'Esame' varchar(40) DEFAULT NULL,
 6  'Voto' int(2) DEFAULT NULL,
 7  PRIMARY KEY ('Matricola'),
 8  KEY 'Last_Name' ('Cognome'),
 9  KEY 'First_Last_Name' ('Nome','Cognome')
10) ENGINE=InnoDB DEFAULT CHARSET=latin1

Come osserviamo, il nome dell’indice contenente i campi Nome e Cognome ha come nome First_Last_Name. A questo punto volendo cancellare l’indice costituito dai campi Nome e Cognome la query da scrivere è la seguente:

1ALTER TABLE studente
2DROP INDEX First_Last_Name;

Oltre ai metodi sopra descritti, esiste un altro modo per creare e rimuovere indici su tabelle MySQL, attraverso i comandi CREATE INDEX, CREATE UNIQUE INDEX e DROP INDEX. Le sintassi da utilizzare sono la seguenti:

1CREATE INDEX Nome_Indice ON Nome_Tabella(Campi_Tabella);
2CREATE UNIQUE INDEX Nome_Indice ON Nome_Tabella(Campi_Tabella);
3DROP INDEX Nome_Indice ON Nome_Tabella;

Quindi, se ad esempio volessimo sulla tabella studente creare un indice di nome Prova, per il campo Esame, le query per inserirlo ed eliminarlo sono le seguenti:

1CREATE INDEX Prova ON studente(Esame);
2
3DROP INDEX Prova ON studente;

Infine bisogna sottolineare che, a differenza del comando ALTER TABLE per la creazione e rimozione di indici, le funzioni di creazione e rimozione indici di cui sopra consentono la creazione e rimozione di un indice alla volta a differenza di quanto si può fare con ALTER TABLE.

Condividi su:

Esprimi un voto:

  • Current rating: 0.0/5
  • 1
  • 2
  • 3
  • 4
  • 5

Argomenti chiave:

Ultimi commenti Ultimi commenti

Esegui il Login oppure registrati per scrivere un commento.
Cerca nel sito...
Ultime recipes

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL MySQL Report un tool di shell per tenere tutto sotto controllo

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL


Vai alla recipe

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL MySQLSniffer sniffare il traffico TCP di MySQL

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL


Vai alla recipe

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso myisamchk riparare file MyISAM

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso il file myisamchk


Vai alla recipe

Un tool per comprimere le tabelle MyISAM fino a oltre il 50% myisampack comprimere file MyISAM

Un tool per comprimere le tabelle MyISAM fino a oltre il 50%


Vai alla recipe

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun mysqlshow visualizzare le informazioni sul database MySQL

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun client


Vai alla recipe

Utilizzando UNION / UNION ALL su campi int unsigned zerofill,
ho notato che MysqlUNION / UNION ALL su campi int unsigned zerofill. di DebUsr
Vai al tip

Utilizzo di funzioni come alias di campo tramite l'impiego di prepared statementReport con alias di campo dinamici di john_revelator
Vai al tip

Può capitare che sia necessario eseguire un dump di database in formato Comma SeparatedEsecuzione dump in formato CSV (tabelle in engine MyIsam esportate in formato CSV) di ghigomatto
Vai al tip

E' possibile eseguire le query SQL contenute in un file di testo. Questo è utileEseguire le query da un file di testo di Sante Caserio
Vai al tip

Se vogliamo fare il backup di tutti i database con mysqldump, e ne abbiamo parecchiFare il backup di tutti i database di Sante Caserio
Vai al tip

Salve, dopo tante storie ho studiato il php e mysql .. . che in questo forum parlavo php e campo mysql timestamp di gigi Vai al topic

ciao a tutti ho creato un forum su aruba ma non so come farlo visualizzare nel mio aruba di albertodiprima Vai al topic

Salve a tutti gente, questo è il mio primo post su questo forum e questo a causa Problema Gravissimo con AutoIncrement di stefanoadsl Vai al topic

Salve! Mi presento, mi chiamo Adriano e sono uno studente di ingegneria informatica Problema Trigger di Xanakro Vai al topic

Ciao a tutti!
Volevo chiedere una informazione.
Ho una query che lanciata la prima Query Eseguita più volte di OltreLeStelle Vai al topic