2009-08-22 12 views
17

Ho recentemente iniziato a sviluppare la mia prima applicazione seria che utilizza un database SQL e sto utilizzando phpMyAdmin per configurare le tabelle. Ci sono un paio di "caratteristiche" opzionali che posso dare varie colonne, e io non sono del tutto sicuro di quello che fanno:SQL: cosa fanno esattamente le chiavi primarie e gli indici?

  • Chiave primaria
  • Indice

So quello che un PK è per e come usarlo, ma credo che la mia domanda riguardo a questo è perché uno ne ha bisogno - come è diverso dal semplice impostare una colonna su "Unico", a parte il fatto che si può avere solo un PK? È giusto che il programmatore sappia che questo valore identifica univocamente il record? O ha anche alcune proprietà speciali?

Non ho idea di cosa faccia "Index" - infatti, le uniche volte in cui l'ho mai visto in uso sono (1) che le mie chiavi primarie sembrano essere indicizzate, e (2) ho sentito che l'indicizzazione è in qualche modo legato alle prestazioni; che vuoi colonne indicizzate, ma non troppe. Come decidere quali colonne indicizzare e cosa fa esattamente?

modifica: nel caso in cui un indice uno potrebbe voler ORDINARE?

Grazie mille,

Mala

risposta

25

chiave primaria è di solito usati per creare un 'id' numerica per i record, e questa colonna id viene automaticamente incrementato.

Ad esempio, se si dispone di una tabella books con id campo, dove il id è la chiave primaria ed è anche impostato su auto_increment (Under 'Extra in phpMyAdmin), quindi la prima volta che aggiungere un libro alla tabella, l'id per quello diventerà 1 '. L'id del prossimo libro sarebbe automaticamente "2" e così via. Normalmente, ogni tabella dovrebbe avere almeno una chiave primaria per facilitare l'identificazione e la ricerca di record facilmente.

Gli indici vengono utilizzati quando è necessario recuperare regolarmente determinate informazioni da una tabella. Ad esempio, se si dispone di una tabella users e sarà necessario accedere molto spesso alla colonna email, sarà possibile aggiungere un indice alla posta elettronica e ciò comporterà una maggiore velocità di accesso alle e-mail.

Tuttavia ci sono anche aspetti negativi per l'aggiunta di indici non necessari, quindi aggiungilo solo sulle colonne a cui è veramente necessario accedere più delle altre. Ad esempio, le query UPDATE, DELETE e INSERT saranno un po 'più lente, maggiore è il numero di indici disponibili, poiché MySQL deve memorizzare informazioni aggiuntive per ogni colonna indicizzata. Maggiori informazioni possono essere trovate a this page.

Modifica: Sì, le colonne che devono essere utilizzate in ORDER BY devono avere molti indici, oltre a quelli utilizzati in WHERE.

+2

grazie, sei stato molto utile! Mi stavo chiedendo però, è l'impostazione di una colonna come PK qualsiasi diversa dall'impostazione di una colonna come un numero intero univoco che auto_incrementi? Fa qualcos'altro sotto il cofano? – Mala

+1

Ho modificato per rispondere alla tua domanda sui lati negativi degli indici. Anche le chiavi primarie funzionano come indici, quindi quando hai un PK su una colonna, tutte le query per SELECT o ORDER BY basate su quell'id saranno più veloci. Inoltre, sarebbe garantito che ogni 'id' è unico, quindi non avrai ID duplicati come potresti avere se hai solo una colonna INT che stai aggiornando. –

+3

Una chiave primaria non deve essere numerica o un singolo campo. e la colonna IDENTITY si adatterebbe meglio a questa descrizione. Invece una chiave primaria serve a comunicare all'RDBMS che i campi specificati possono identificare in modo univoco una singola riga nella tabella. Essenzialmente un INDICE UNICO. È normale (ma non obbligatorio) che le chiavi primarie siano anche il fattore di controllo in quale ordine vengono archiviati i dati (chiave primaria in cluster in SQLServer) e quindi migliorano sensibilmente il tempo richiesto per trovare le righe di dati (per leggere, scrivere, qualunque sia) – MatBailie

7

La chiave primaria è fondamentalmente una colonna indicizzata univoca che funge da ID "ufficiale" di righe in quella tabella. Ancora più importante, viene generalmente utilizzato per le relazioni con le chiavi esterne, ad esempio se un'altra tabella si riferisce a una riga nella prima, conterrà una copia della chiave primaria di quella riga.

Si noti che è possibile avere una chiave primaria composta, cioè una che comprende più di una colonna.

Gli indici migliorano i tempi di consultazione. Solitamente sono basati su albero, quindi cercare una determinata riga tramite un indice richiede O (log (n)) piuttosto che eseguire la scansione dell'intera tabella.

In genere, qualsiasi colonna di una tabella di grandi dimensioni utilizzata frequentemente nelle clausole WHERE, ORDER BY o (in particolare) JOIN deve avere un indice. Poiché l'indice deve essere aggiornato per evey INSERT, UPDATE o DELETE, rallenta tali operazioni. Se hai poche scritture e molte letture, indicizza il contenuto del tuo ascolto. Se hai molte scritture e molte query che richiedono indici su molte colonne, hai un grosso problema.

6

La differenza tra una chiave primaria e una chiave univoca viene spiegata meglio mediante un esempio.

abbiamo una tabella di utenti:

USER_ID number 
NAME varchar(30) 
EMAIL varchar(50) 

In tale tabella l'USER_ID è la chiave primaria. Il NOME non è unico: ci sono molti John Smith e Muhammed Khan nel mondo. L'EMAIL è necessariamente unico, altrimenti il ​​sistema di posta elettronica mondiale non funzionerebbe. Quindi poniamo un vincolo univoco su EMAIL.

Perché allora abbiamo bisogno di una chiave primaria separata? Tre ragioni:

  1. il tasto numerico è più efficiente se usato in straniere chiave rapporti in quanto richiede meno spazio
  2. l'e-mail può cambiare (ad esempio fornitore di scambio), ma l'utente è sempre lo stesso ; increspatura un cambio di un valore di chiave primaria per tutto uno schema è sempre un incubo
  3. è sempre una cattiva idea di utilizzare informazioni sensibili o privato, come una chiave esterna
3

Nel modello relazionale, qualsiasi colonna o set di colonne che è garantito sia presente che unico nella tabella può essere chiamato una chiave candidata alla tabella. "Presente" significa "NOT NULL". È prassi comune nella progettazione di database designare una delle chiavi candidate come chiave primaria e utilizzare riferimenti alla chiave primaria per fare riferimento all'intera riga o all'oggetto dell'oggetto descritto dalla riga.

In SQL, un vincolo PRIMARY KEY equivale a un vincolo NOT NULL per ogni colonna di chiave primaria e un vincolo UNIQUE per tutte le colonne di chiavi primarie prese insieme. In pratica molte chiavi primarie risultano essere singole colonne.

Per la maggior parte dei prodotti DBMS, un vincolo PRIMARY KEY produrrà anche un indice che viene generato automaticamente sulle colonne chiave primarie. Ciò accelera l'attività di verifica dei sistemi quando vengono create nuove voci per la chiave primaria, per assicurarsi che il nuovo valore non duplichi un valore esistente. Inoltre velocizza le ricerche in base al valore della chiave primaria e si unisce tra la chiave primaria e una chiave esterna che la fa riferimento. L'entità della velocità dipende da come funziona Query Optimizer.

In origine, i progettisti di database relazionali cercavano le chiavi naturali nei dati come dati. Negli ultimi anni, la tendenza è stata quella di creare sempre una colonna denominata ID, un intero come prima colonna e la chiave primaria di ogni tabella. La funzione di generazione automatica del DBMS viene utilizzata per garantire che questa chiave sia univoca. Questa tendenza è documentata negli "standard di progettazione di Oslo".Non è necessariamente un progetto relazionale, ma serve alcuni bisogni immediati delle persone che lo seguono. Non raccomando questa pratica, ma riconosco che è la pratica prevalente.

Un indice è una struttura dati che consente di accedere rapidamente a poche righe in una tabella, in base a una descrizione delle colonne della tabella che sono indicizzate. L'indice consiste in copie di determinate colonne di tabelle, chiamate chiavi dell'indice, intervallate da puntatori alle righe della tabella. I puntatori sono generalmente nascosti agli utenti del DBMS. Gli indici funzionano in tandem con Query Optimizer. L'utente specifica in SQL quali dati vengono ricercati e l'ottimizzatore fornisce strategie indicizzate e altre strategie per tradurre ciò che viene cercato in una strategia per trovarlo. Esiste un qualche tipo di principio organizzativo, come l'ordinamento o l'hashing, che consente di utilizzare un indice per ricerche veloci e altri usi. Questo è tutto interno al DBMS, una volta che il builder del database ha creato l'indice o dichiarato la chiave primaria.

È possibile creare indici che non hanno nulla a che fare con la chiave primaria. Una chiave primaria può esistere senza un indice, sebbene questa sia generalmente una pessima idea.

+0

(se sei ancora in giro) = Sono curioso di sapere perché non consigli di impostare una colonna intera come chiave primaria. Ho fatto di questo una pratica regolare nel mio sviluppo SQL e ho scoperto che rende selezioni, aggiornamenti, inserti ed eliminazioni da script PHP (oltre a stabilire relazioni tra tabelle e la creazione di join) molto più semplice rispetto a fare affidamento su PK naturali derivati ​​da i dati. – Vega

+0

È un punto controverso, dal momento che la mia vista è una visione minoritaria. –

Problemi correlati