Che cos'è un indice in SQL?


440

Che cos'è un indice in SQL? Puoi spiegare o fare riferimento per capire chiaramente?

Dove dovrei usare un indice?

Risposte:


377

Un indice viene utilizzato per velocizzare la ricerca nel database. MySQL ha una buona documentazione sull'argomento (che è rilevante anche per altri server SQL): http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Un indice può essere utilizzato per trovare in modo efficiente tutte le righe corrispondenti a una colonna della query e quindi scorrere solo quel sottoinsieme della tabella per trovare corrispondenze esatte. Se non hai indici su nessuna colonna della WHEREclausola, il SQLserver deve percorrere l'intera tabella e controllare ogni riga per vedere se corrisponde, il che può essere un'operazione lenta su grandi tabelle.

L'indice può anche essere un UNIQUEindice, il che significa che non è possibile avere valori duplicati in quella colonna o PRIMARY KEYche in alcuni motori di archiviazione definisce dove è archiviato il valore nel file di database.

In MySQL puoi usare EXPLAINdavanti alla tua SELECTdichiarazione per vedere se la tua query utilizzerà qualsiasi indice. Questo è un buon inizio per la risoluzione dei problemi di prestazioni. Maggiori informazioni qui: http://dev.mysql.com/doc/refman/5.0/en/explain.html


"L'indice può anche essere un indice UNICO ..." Solo per confermare con te, significa che l'indice può essere anche NON UNICO? Ho sempre pensato che fosse UNICO. Sono abbastanza nuovo a SQL, mi perdoni
Daniel Kurniadi

@DanielKurniadi La maggior parte degli indici non è unica. Potrei avere un database di utenti e vorrei fare una query per tutti coloro che vivono a Göteborg. Un indice sul campo "città" velocizzerebbe la mia domanda. Ma a Göteborg vivono più di 1 utenti, quindi l'indice deve essere non unico.
Emil Vikström,

174

Un indice cluster è come il contenuto di una rubrica. Puoi aprire il libro su "Hilditch, David" e trovare tutte le informazioni per tutti gli "Hilditch's uno accanto all'altro. Qui le chiavi per l'indice cluster sono (cognome, nome).

Ciò rende gli indici cluster ideali per il recupero di molti dati in base a query basate sull'intervallo poiché tutti i dati si trovano uno accanto all'altro.

Poiché l'indice cluster è in realtà correlato al modo in cui i dati vengono archiviati, ne esiste solo uno per tabella (sebbene sia possibile imbrogliare per simulare più indici cluster).

Un indice non cluster è diverso in quanto è possibile averne molti e quindi puntano ai dati nell'indice cluster. Potresti avere, ad esempio, un indice non raggruppato sul retro di una rubrica che è digitata (città, indirizzo)

Immagina se dovessi cercare nella rubrica tutte le persone che vivono a "Londra" - con solo l'indice cluster dovresti cercare ogni singolo elemento nella rubrica poiché la chiave dell'indice cluster è attiva (cognome, nome di battesimo) e di conseguenza le persone che vivono a Londra sono sparse in modo casuale in tutto l'indice.

Se si dispone di un indice non cluster su (città), queste query possono essere eseguite molto più rapidamente.

Spero che aiuti!


151

Un'ottima analogia è pensare a un indice del database come a un indice di un libro. Se hai un libro sui paesi e stai cercando l'India, perché dovresti sfogliare l'intero libro - che è l'equivalente di una scansione completa della tabella nella terminologia del database - quando puoi semplicemente andare all'indice sul retro del libro, che ti dirà le pagine esatte in cui puoi trovare informazioni sull'India. Allo stesso modo, poiché un indice del libro contiene un numero di pagina, un indice del database contiene un puntatore alla riga contenente il valore che stai cercando nel tuo SQL.

Più qui


2
Ammiro i ragazzi esperti che spiegano le cose usando "analogie". +1
snr

82

Un indice viene utilizzato per accelerare le prestazioni delle query. Lo fa riducendo il numero di pagine di dati del database che devono essere visitate / scansionate.

In SQL Server, un indice cluster determina l'ordine fisico dei dati in una tabella. Può esserci un solo indice cluster per tabella (l'indice cluster È la tabella). Tutti gli altri indici su una tabella sono definiti non cluster.


49

Gli indici riguardano la ricerca rapida dei dati .

Gli indici in un database sono analoghi agli indici che trovi in ​​un libro. Se un libro ha un indice e ti chiedo di trovare un capitolo in quel libro, puoi trovarlo rapidamente con l'aiuto dell'indice. D'altra parte, se il libro non ha un indice, dovrai dedicare più tempo alla ricerca del capitolo guardando ogni pagina dall'inizio alla fine del libro.

In modo simile, gli indici in un database possono aiutare le query a trovare rapidamente i dati. Se non conosci gli indici, i seguenti video possono essere molto utili. In effetti, ho imparato molto da loro.

Nozioni di base sugli
indici Indici cluster e non cluster Indici
unici e non unici
Vantaggi e svantaggi degli indici


Leggere tutte le risposte mi ha fatto chiedermi perché non indicizzare tutto. +1 per l'inclusione del collegamento contenente gli svantaggi.
Lakshay Garg

@LakshayGarg A volte l'indicizzazione non necessaria può anche rallentare il tempo di esecuzione della query, quindi non dovremmo provare a indicizzare tutto. Proprio come ogni cosa ha i suoi pro e contro.
Gaurav Rajdeo,

@LakshayGarg Gaurav Rajdeo ha ragione. Anche per mantenere la stessa analogia: potresti voler indicizzare ogni capitolo, figura o tabella di un libro, ma non ogni paragrafo, frase o parola. Normalmente, ciò sarebbe eccessivo e porterebbe a complicazioni inutili. Spero che questo sia abbastanza vicino all'immagine disegnata in questa risposta.
Colidyre,

23

Bene, in generale l'indice è a B-tree. Esistono due tipi di indici: cluster e non cluster.

L' indice cluster crea un ordine fisico di righe (può essere solo uno e nella maggior parte dei casi è anche una chiave primaria: se si crea una chiave primaria sulla tabella, si crea anche un indice cluster su questa tabella).

Anche l' indice non cluster è un albero binario ma non crea un ordine fisico di righe. Quindi i nodi foglia di indice non cluster contengono PK (se esiste) o indice di riga.

Gli indici vengono utilizzati per aumentare la velocità della ricerca. Perché la complessità è di O (log N). Gli indici sono argomenti molto ampi e interessanti. Posso dire che a volte la creazione di indici su un grande database è una sorta di arte.


6
in generale, è un albero b piuttosto che un albero binario.
Mitch Wheat,

quindi, poiché gli indici usano alberi auto-bilanciati, ogni volta che aggiungi / elimini una riga si bilancerà da solo - rendendo l'inserimento / la cancellazione più costoso ... corretto?
David Refaeli,

20

INDEXES - per trovare facilmente i dati

UNIQUE INDEX - non sono ammessi valori duplicati

Sintassi per INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

Sintassi per UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

13

Innanzitutto dobbiamo capire come viene eseguita la query normale (senza indicizzazione). Fondamentalmente attraversa ciascuna riga una per una e quando trova i dati che restituisce. Fare riferimento alla seguente immagine. (Questa immagine è stata presa da questo video .)

Senza indicizzazione Quindi supponiamo che la query trovi 50, dovrà leggere 49 record come una ricerca lineare.

Fare riferimento alla seguente immagine. (Questa immagine è stata presa da questo video )

inserisci qui la descrizione dell'immagine

Quando applichiamo l'indicizzazione, la query scoprirà rapidamente i dati senza leggerli ognuno semplicemente eliminando la metà dei dati in ciascun attraversamento come una ricerca binaria. Gli indici mysql sono memorizzati come albero B dove tutti i dati sono nel nodo foglia.


12

INDEX è una tecnica di ottimizzazione delle prestazioni che accelera il processo di recupero dei dati. È una struttura di dati persistente associata a una tabella (o vista) al fine di aumentare le prestazioni durante il recupero dei dati da quella tabella (o vista).

La ricerca basata sull'indice viene applicata in particolare quando le query includono il filtro WHERE. Altrimenti, vale a dire, una query senza filtro WHERE seleziona dati e processi completi. La ricerca dell'intera tabella senza INDICE si chiama Scansione tabella.

Troverai informazioni esatte per gli indici SQL in modo chiaro e affidabile: segui questi link:

  1. Per una comprensione saggia: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. Per una comprensione saggia dell'implementazione: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html

6

Un indice viene utilizzato per diversi motivi. Il motivo principale è velocizzare le query in modo da poter ottenere righe o ordinare le righe più velocemente. Un altro motivo è definire un indice a chiave primaria o univoco che garantisca che nessun'altra colonna abbia gli stessi valori.


6

Se si utilizza SQL Server, una delle migliori risorse è la propria documentazione in linea fornita con l'installazione! È il primo posto a cui farei riferimento per QUALSIASI argomento correlato a SQL Server.

Se è pratico "come dovrei farlo?" tipo di domande, quindi StackOverflow sarebbe un posto migliore da porre.

Inoltre, non sono tornato per un po 'ma sqlservercentral.com era uno dei principali siti correlati a SQL Server.


0

Un indice è un on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. Un indice contiene chiavi create da una o più colonne nella tabella o nella vista. Queste chiavi sono archiviate in una struttura (albero B) che consente a SQL Server di trovare la riga o le righe associate ai valori chiave in modo rapido ed efficiente.

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

Se si configura un PRIMARY KEY, Motore di database crea automaticamente un indice cluster, a meno che non esista già un indice cluster. Quando si tenta di applicare un vincolo PRIMARY KEY su una tabella esistente ed esiste già un indice cluster su quella tabella, SQL Server applica la chiave primaria utilizzando un indice non cluster.

Fare riferimento a questo per ulteriori informazioni sugli indici (in cluster e non in cluster): https://docs.microsoft.com/en-us/sql/relational-d database/indexes/clustered-and-nonclustered-indexes-described?view = sql-server-ver15

Spero che sia di aiuto!

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.