Domandina sugli indici

Perdonerete la banalità della domanda...

Uso da qualche mese php e mysql, capisco perfettamente che un indice è un elenco di valori che indicano al database dove si trova la riga che contiene ciò che cerchiamo, ho capito pure un indice rallenta le operazioni di inserimento/modifica dei dati per velocizzarne la ricerca, però riflettendo un po' ho bisogno di un paio di chiarimenti-conferme:

  • Ma le differenze tra PRIMARY KEY e UNIQUE KEY, a parte la possibilità di definire la prima come Auto increment, quali sono? Sono chiavi uniche entrambe o no? Quando usare l'uno o l'altro?
  • Per scegliere come definire gli indici di una tabella credo basti vedere i campi che ricorrono dopo WHERE nelle SELECT, giusto? In "SELECT campo1 WHERE campo2=valore" campo2 deve essere indice?

Mille grazie!  :bye:

inviato 10 anni fa
usecram
X 0 X

Gli indici sono strutture dati che si affiancano ad una tabella e ne permettono un accesso diverso da quello sequenziale, di diversi ordini di grandezza più veloce:

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

In MySQL gli indici sono quasi sempre delle strutture BTree:

http://it.wikipedia.org/wiki/B-Albero

PRIMARY KEY, UNIQUE e FULLTEXT sono degli indici (INDEX)

UNIQUE è un indice con un vincolo: due record non possono avere lo stesso valore, fatta eccezione per il NULL

PRIMARY KEY è un indice con 2 vincoli: non può avere valori NULL e  due record non possono avere lo stesso valore. E' quindi un UNIQUE senza NULL. Qesti sono i vincoli previsti dalla chiave primaria, come definita nel modello relazionale.

Qualsiasi campo intero provvisto di indice può essere AUTO_INCREMENT, es:

CREATE TABLE test (                     

`id` int(11) NOT NULL default '0',     

`data` varchar(128) default NULL,       

`id2` int(11) NOT NULL auto_increment, 

PRIMARY KEY  (`id`),                   

KEY `id2` (`id2`)                       

)

A mio parere la chiave primaria va specificata sempe perché è molto probabile (soprattutto se il DB è stato progettato bene) che venga utilizzata all'interno delle clausole WHERE

Poiché gli indici hanno un costo (INSERT più lente), se ci si rende conto che si effettuano molte WHERE su campi diversi dalla chiave primaria, sopratutto per tabella con molti record, allora può convenire creare un indice

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Risposta da mettere nei preferiti (cosa che molti staranno facendo)  O0

Grazie

risposto 10 anni fa
usecram
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda