Mysql
 sql >> Database >  >> RDS >> Mysql

Indici MySQL 5.0 - Unici vs Non Unici

UNIQUE e PRIMARY KEY sono vincoli , non indici. Sebbene la maggior parte dei database implementi questi vincoli utilizzando un indice. L'overhead aggiuntivo del vincolo oltre all'indice è insignificante, soprattutto se si tiene conto del costo per rintracciare e correggere i duplicati non intenzionali quando (non se) si verificano.

Gli indici sono generalmente più efficaci se hai un'elevata selettività . Questo è il rapporto tra il numero di valori distinti e il numero totale di righe.

Ad esempio, in una colonna per il numero di previdenza sociale, potresti avere 1 milione di righe con 1 milione di valori distinti. Quindi la selettività è 1000000/1000000 =1.0 (sebbene ci siano rare eccezioni storiche, i SSN sono destinati ad essere unici).

Ma un'altra colonna in quella tabella, "genere" può avere solo due valori distinti su 1 milione di righe. 2/1000000 =selettività molto bassa.

È garantito che un indice con un vincolo UNIQUE o PRIMARY KEY abbia una selettività di 1.0, quindi sarà sempre efficace quanto un indice può essere.

Hai chiesto la differenza tra una chiave primaria e un vincolo univoco. Principalmente, è che puoi avere un solo vincolo di chiave primaria per tabella (anche se la definizione di quel vincolo include più colonne), mentre puoi avere più vincoli univoci. Una colonna con un vincolo univoco può consentire NULL, mentre le colonne nei vincoli di chiave primaria non devono consentire NULL. In caso contrario, chiave primaria e univoca sono molto simili nella loro implementazione e nel loro utilizzo.

Hai chiesto in un commento se utilizzare MyISAM o InnoDB. In MySQL usano il termine motore di archiviazione . Ci sono un sacco di sottili differenze tra questi due motori di archiviazione, ma i principali sono:

  • InnoDB supporta le transazioni, quindi puoi scegliere di eseguire il rollback o il commit delle modifiche. MyISAM è effettivamente sempre autocommit.
  • InnoDB applica vincoli di chiave esterna. MyISAM non applica né memorizza vincoli di chiave esterna.

Se queste funzionalità sono cose di cui hai bisogno nella tua applicazione, allora dovresti usare InnoDB.

Per rispondere al tuo commento, non è così semplice. InnoDB è in realtà più veloce di MyISAM in molti casi, quindi dipende dal mix di selezioni, aggiornamenti, query simultanee, indici, configurazione del buffer della tua applicazione, ecc.

Vedi http:/ /www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/ per un confronto molto approfondito delle prestazioni degli storage engine. InnoDB vince su MyISAM abbastanza frequentemente che non è chiaramente possibile dire che uno sia più veloce dell'altro.

Come per la maggior parte delle domande relative alle prestazioni, l'unico modo per rispondere per la tua applicazione consiste nel testare entrambe le configurazioni utilizzando la tua applicazione e un campione rappresentativo di dati e misurare i risultati.