È necessario creare esplicitamente un indice o è implicito nella definizione della chiave primaria? La risposta è la stessa per MyISAM e InnoDB?
È necessario creare esplicitamente un indice o è implicito nella definizione della chiave primaria? La risposta è la stessa per MyISAM e InnoDB?
Risposte:
La chiave primaria è sempre indicizzata. Questo è lo stesso per MyISAM e InnoDB ed è generalmente vero per tutti i motori di archiviazione che supportano gli indici.
Secondo http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html sembrerebbe che questo sia implicito
Anche se questo è stato chiesto nel 2009, ho pensato di pubblicare un vero riferimento alla documentazione di MySQL su chiavi primarie. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html
La chiave primaria per una tabella rappresenta la colonna o l'insieme di colonne utilizzate nelle query più vitali. Ha un indice associato, per prestazioni veloci delle query
Per riferimento a MySQL 5.0 vedere: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
La maggior parte degli indici MySQL ( PRIMARY KEY , UNIQUE, INDEX e FULLTEXT) sono memorizzati in alberi B. Le eccezioni sono che gli indici sui tipi di dati spaziali utilizzano alberi R e che le tabelle MEMORY supportano anche gli indici hash.
La chiave primaria viene indicizzata implicitamente sia per MyISAM che per InnoDB. È possibile verificarlo utilizzando EXPLAIN su una query che utilizza la chiave primaria.
Immagino che questa sia la risposta
mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)
mysql> show indexes from test \G
*************************** 1. row ***************************
Table: test
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)
Gli indici vengono utilizzati al meglio su colonne utilizzate frequentemente nelle clausole where e in qualsiasi tipo di ordinamento, ad esempio "ordina per". Potresti lavorare su un database più complesso, quindi è bene ricordare alcune semplici regole.
Gli indici accelerano dove le clausole e ordinano per. Ricorda di pensare a come verranno utilizzati i tuoi dati durante la creazione delle tabelle. Ci sono alcune altre cose da ricordare. Se il tuo tavolo è molto piccolo, cioè solo pochi dipendenti, è peggio usare un indice che lasciarlo fuori e lasciarlo fare una scansione del tavolo.
Gli indici sono davvero utili solo con le tabelle che hanno molte righe.
Un'altra cosa da ricordare, che è un contro nella situazione del database dei nostri dipendenti, è che se la colonna ha una lunghezza variabile, gli indici (così come la maggior parte di MySQL) funzionano in modo molto meno efficiente.
Non dimenticare anche le iscrizioni! I campi di join indicizzati velocizzano le cose.
La chiave primaria è sempre indicizzata automaticamente e unica. Quindi, attenzione a non creare indici ridondanti.
Ad esempio, se hai creato una tabella come tale
CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;
poiché vuoi indicizzare la chiave primaria e imporre un vincolo di unicità su di essa, finiresti per creare tre indici foo
!
Si può pensare a una colonna chiave primaria come a qualsiasi altra colonna indicizzata con i vincoli della chiave primaria.
Nella maggior parte dei casi d'uso abbiamo bisogno sia della chiave primaria, sia delle colonne / colonne indicizzate in una tabella, perché le nostre query alla tabella possono filtrare le righe in base a colonne / colonne che non sono chiavi primarie, in quel caso di solito indicizziamo quelle colonne / colonne anche.