2010-11-04 3 views
19

In documenti per vari ORM hanno sempre forniscono un modo per creare gli indici, ecc Essi citano sempre per essere sicuri di creare gli indici appropriati per l'efficienza, come se cioè la conoscenza inerente a un non-mano-scritto-SQLer che ha bisogno di usa un ORM. La mia comprensione degli indici (al di fuori di PK) è fondamentalmente: se si prevede di fare query LIKE (cioè ricerca) in base al contenuto di una colonna, è necessario utilizzare un indice di testo completo per quella colonna. Cos'altro dovrei sapere sugli indici (principalmente relativi all'efficienza)? Mi sento come se ci fosse un mondo di conoscenza alla mia porta, ma c'è un enorme tappetino per il mouse ripiegato sotto, quindi non riesco a passare (non so perché mi sentivo come se avessi bisogno di dirlo, ma grazie per aver fornito il divano).Come faccio a sapere quando indicizzare una colonna e con cosa?

risposta

21

pensare ad un indice molto approssimativamente come l'indice nella parte posteriore di un libro. È un'area completamente separata dal contenuto del libro, dove se stai cercando un valore specifico, puoi andare all'indice e cercarlo (gli indici sono ordinati, quindi trovare le cose lì è molto più rapido rispetto alla scansione di ogni pagina del libro).

La voce di indice ha un numero di pagina, in modo da poter poi rapidamente andare alla pagina che cercano il vostro soggetto. Un indice di database è molto simile; è un elenco ordinato delle informazioni rilevanti nel database (i campi inclusi nell'indice), con le informazioni per il database per trovare i record corrispondenti.

Quindi ... si potrebbe creare un indice quando si dispone di informazioni che è necessario per cercare di frequente. Gli indici normali non ti aiutano per ricerche "parziali" come le query LIKE, ma ogni volta che devi ottenere una serie di risultati in cui il campo X ha determinati valori, essi impediscono al DBMS di 'scansionare' l'intera tabella , cercando valori corrispondenti.

Aiutano anche quando si ha bisogno di ordinare su una colonna.

Un'altra cosa da tenere a mente; Se il DBMS consente di creare singoli indici con più campi, accertarsi di esaminare gli effetti di tale operazione, specifici per il proprio DBMS. È probabile che un indice che include più campi sia pienamente (o del tutto) utile se tutti quei campi vengono utilizzati in una query. Viceversa, disporre di più indici per una singola tabella, con un campo per indice, potrebbe non essere di molto (o nessuno) aiuto per le query che filtrano/ordinano in base a più campi.


Hai menzionato gli indici di testo completo e i PK (chiavi primarie). Questi sono diversi dagli indici regolari, sebbene spesso servano a scopi simili.

In primo luogo, si noti che una chiave primaria è solitamente un indice (in MSSQL, un "indice cluster", in realtà), ma non è necessario che sia il caso specifico. Ad esempio, un PK MSSQL è un indice cluster per impostazione predefinita; Gli indici cluster sono speciali in quanto non sono un bit separato di dati memorizzati altrove, ma i dati stessi sono disposti nella tabella in ordine dall'indice clusterizzato. Questo è il motivo per cui un popolare PK è un valore int che viene generato automaticamente con valori sequenziali e crescenti. Pertanto, un indice raggruppato ordina i dati nella tabella in modo specifico in base al valore del campo. Confronta questo con un dizionario tradizionale; le voci stesse sono ordinate dalla "chiave", che è la parola che viene definita.

Ma in MSSQL (consultare la documentazione DBMS per vostra informazione), è possibile modificare l'indice cluster di essere un campo diverso, se volete. A volte ciò avviene nei campi basati su datetime.


Gli indici di testo completo sono completamente diversi tipi di animali. Usano alcuni degli stessi principi, ma quello che stanno facendo non è esattamente lo stesso degli indici normali, che sto descrivendo. Inoltre: in alcuni DBMS, le query LIKE fanno non utilizzano l'indice di testo completo; sono richiesti operatori di query speciali.

Questi indici sono diversi perché il loro intento non è quello di trovare/ordinare sull'intero valore della colonna (un numero, una data, un breve bit di dati char), ma invece di trovare singole parole/frasi all'interno del testo campo (i) indicizzato.

Spesso possono anche consentire la ricerca di parole simili, tempi diversi, errori di ortografia comuni e simili, e tipicamente ignorare le parole di disturbo. Il modo diverso in cui lavorano è il motivo per cui potrebbero anche aver bisogno di operatori diversi per utilizzarli. (di nuovo, controlla la documentazione locale per il tuo DBMS!)

+3

Eccellente, grazie. Quindi, fondamentalmente un indice è solo un elenco di valori di una colonna, ognuno con un link alla riga corretta (presumo che questo sarebbe il PK). Il DBMS dovrebbe altrimenti scorrere le righe della tabella, guardando solo la colonna rilevante durante la scansione di un risultato. Se questo è (approssimativamente) corretto, la tua risposta mi ha aiutato molto. – orokusaki

+0

@orokusaki Ho modificato il tuo commento come hai notato. (I Mod possono essere modificati senza limiti di tempo). Buon chiarimento! –