Allora...
In MySQL esistono 2 tipi di indici:
1. chiavi primarie
2. indice
esiste anche un terzo tipo di indice (supportato solo da MyISAM): fulltext. questo, però, non ci interessa, in quanto ha a che fare con la ricerca di testo all'interno di stringhe, e non con l'ottimizzazione della ricerca di un record.
le chiavi primarie sono un valore che identifica univocamente un record della tabella. ogni tabella può avere AL MASSIMO 1 colonna con una chiave primaria, e, nonostante non sia obbligatoria, ti consiglio di crearne SEMPRE una.
Di solito la chiave primaria è un numero intero che rappresenta l'ID del record, e spesso ha anche l'auto increment.
Gli indici "normali", invece, servono ad ottimizzare la ricerca di un valore.
Ad esempio, se tu hai una colonna "Nome" che usi spesso in una query di ricerca (es. "SELECT * FROM tabella WHERE nome = 'Mario'"), puoi pensare di renderla indice. In questo modo il MySQL memorizzerà il nome, oltre che nella riga, anche in un'altra struttura, organizzata in modo tale da rendere la ricerca di quel valore più veloce.
Quando tu cerchi 'Mario' nel campo nome, quindi, il database non va a cercare direttamente nei record, ma cerca in quell'altro "archivio" (che in realtà è un BTREE, se sai un po' di teoria degli alberi). Appena trova una riga con nome 'Mario', quindi, va a prelevare il record avente quella chiave primaria.
Gli indici possono anche essere di tipo "UNIQUE": in questo modo, non sono ammessi valori duplicati (nell'esempio di prima, se c'è già una persona di nome 'Mario' nella tabella, cercare di inserire un'altra persona con quel nome darà un errore). Le chiavi uniche spesso sono molto comode, anche se rallentano un po' l'inserimento dei dati (di molto poco; tuttavia, meglio non abusarne ).
Per creare un indice si può usare PHPMyAdmin: nella visualizzazione struttura della tabella, basta cliccare in uno dei 3 bottoni qui sotto:
http://img693.imageshack.us/img693/4...0124a20105.png
Il primo crea una CHIAVE PRIMARIA in quella colonna; il secondo un INDICE ("normale"); il terzo un indice UNIQUE. Il quarto bottone serve invece a creare indici fulltext; qui è grigio perchè non è un campo di tipo text.
Esempio: una tabella che deve memorizzare dei messaggi (ad esempio messaggi privati di un forum ecc).
Ci saranno i seguenti campi:
- id_messaggio, di tipo bigint (intero a 64 bit) unsigned: l'ID del messaggio. Ha l'autoincrement
- mittente, di tipo intero (l'id dell'utente mittente)
- destinatario, di tipo intero (l'id dell'utente destinatario)
- ora, di tipo intero (timestamp unix)
- letto, di tipo tinyint
- testo, di tipo text
In una tabella del genere, io creerei i seguenti indici:
-id_messaggio di tipo CHIAVE PRIMARIA (tra l'altro, l'essere chiave primaria è condizione necessaria per poter usare l'autoincrement)
- mittente, con un indice "normale"
- destinatario, con anche qui un indice "normale"
- ora, altro indice "normale"
questo perché generalmente le query saranno sempre del tipo:
SELECT * FROM messaggi WHERE mittente = XXX
SELECT * FROM messaggi WHERE destinatario = XXX AND letto = 0
SELECT * FROM messaggi WHERE mittente = XXX AND ora > YYY
Nota che non ho reso il campo "letto" indice: non è necessario che ogni campo che appare in una clausula WHERE lo sia.
In questo caso, infatti, la ricerca sarà prima fatta per il mittente, e poi filtrata con letto. Creare un indice su letto non porterebbe alcun vantaggio reale.
Spero di essere stato abbastanza chiaro.
Intanto, prova a fare questo: ti garantisco che l'aumento delle performance sarà enorme.
Se non dovesse bastare, poi, passiamo ai livelli successivi (caching e uso di database non relazionali).