La chiave primaria viene automaticamente indicizzata in MySQL?


243

È necessario creare esplicitamente un indice o è implicito nella definizione della chiave primaria? La risposta è la stessa per MyISAM e InnoDB?

Risposte:


294

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.


5
Se la chiave primaria è sempre indicizzata, perché le persone quando parlano di architettura / prestazioni del database consigliano sempre ai nuovi arrivati ​​di SQL di "assicurarsi che il loro database sia correttamente indicizzato"?
Tim Peterson,

35
@tim: Stanno dicendo alle persone di assicurarsi che qualsiasi altra colonna utilizzata per filtrare, raggruppare o ordinare abbia anche degli indici.
Emil H,

15
Non dimenticare anche le iscrizioni! I campi di join indicizzati velocizzano le cose.
Just John


16

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.


11

La chiave primaria viene indicizzata implicitamente sia per MyISAM che per InnoDB. È possibile verificarlo utilizzando EXPLAIN su una query che utilizza la chiave primaria.


9

Non è necessario creare esplicitamente un indice per una chiave primaria ... viene eseguito per impostazione predefinita.


8

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)

7

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 rallentano gli inserti e gli aggiornamenti, quindi si desidera utilizzarli con attenzione sulle colonne che vengono aggiornate di frequente.
  • 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.


4

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!


0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.