Domanda

Io uso indici come la maggior parte sviluppatori fanno (per lo più su ... beh indice!), Ma sono sicuro che ci sono un sacco di modo sottile per ottimizzare un database utilizzando indice. Non sono sicuro se è specifico per qualsiasi implementazione di un DBMS.

La mia domanda è: quali sono buoni esempi di come utilizzare indice (ad eccezione, casi evidenti di base), e come fa un DBMS ottimizzare il proprio database quando si specifica un indice in una tabella

È stato utile?

Soluzione

Pensate a un indice di "sommario" ... che è un elenco ordinato di puntatori a posizioni in un file, in arte offset. Dire che si dispone di milioni di record memorizzati in una tabella, piuttosto che cercare la tabella coincidenti, è molto più veloce per fare riferimento a un elenco ordinato per le partite, quindi impilare i puntatori alle righe specifiche corrispondenti. Un perfetto esempio di un indice è una tabelle primario campo chiave, più tipicamente suo campo "id". Se si desidera fila id # 11.234.566, è molto più veloce chiedere l'indice per un puntatore ai dati di quanto lo sia per la scansione l'origine dati per la posizione 11234566.

Ecco un utilizzo non così ovvio di indicizzazione:

CREATE TABLE activity_log (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
activity_type_id SMALLINT UNSIGNED NOT NULL,
datetime_created DATETIME
KEY(activity_type_id),
PRIMARY KEY(id)
);
CREATE TABLE activity_log_to_date_key (
activity_log_id INT UNSIGNED NOT NULL,
date_created_key  INT UNSIGNED NOT NULL REFERENCES dim_datetime(id),
UNIQUE KEY(activity_log_id),
KEY(date_created_key)
);
CREATE TABLE dim_datetime (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_hour DATETIME NOT NULL,
PRIMARY KEY(id),
KEY(date_hour)
);

L'operazione non possibile creare il record di log, ma quindi creare un riferimento a un datetime indicizzato che è più veloce di cercare / sorta di vostra tabella di log. Poi unirsi indietro la vostra tabella di log sulla propria chiave primaria. Se avete bisogno di me per espandere su questo, me lo faccia sapere. Spero che questo ha un senso.

Query di esempio:

SELECT a.activity_log_id, al.activity_type_id, al.datetime_created
FROM activity_log_to_date_key a 
INNER JOIN dim_datetime d ON (d.id = a.date_created_key)
LEFT JOIN activity_log al ON (al.id = a.activity_log_id)
WHERE d.date_hour BETWEEN '2009-01-01 00:00:00' AND '2009-06-01 12:00:00';

Altri suggerimenti

Un punto che un sacco di persone sembrano perdere è che un DBMS spesso (o effettua) utilizzare un solo indice per ogni tabella di riferimento in una query, e se si può e fa uso più indici si sarebbe probabilmente più veloce utilizzare un indice combinato se presente.

Per esempio, se la ricerca di un grande tavolo per le righe WHERE AnIntegerColumn = 42 AND AnOtherInt = 69 il percorso più veloce per le righe sarebbe un indice su due colonne AnIntegerColumn e AnOtherInt. Se avete solo un indice su ogni indice individualmente, ma non combinata DB sarà o cercare uno o l'altro indice e separatamente filtrare i risultati con la seconda clausola, o la scansione sia e sposare i risultati in seguito.

Un altro semplice operazione comune che può essere migliorata con indici compositi è WHERE SomeColumn = <SomeValue> ORDER BY SomeOtherColumn - se c'è un indice sulla SomeColumn e SomeOtherColumn (nel giusto ordine) le operazioni di filtraggio e di ordinazione possono essere eseguite contemporaneamente in alcune circostanze

L'aggiunta di troppi indici può essere una cattiva ottimizzazione naturalmente, come lo spazio extra utilizzato per memorizzare gli indici (e IO-carico per mantenere loro se il vostro DB vede molte operazioni di scrittura) può essere un problema peggiore del un po 'meno ottimale leggere query, in modo da non strafare.

David e Randy hanno questa coperta. Volevo solo aggiungere che il comando EXPLAIN può essere un enorme aiuto nel capire quando si otterrà un grande risparmio di creare un indice, oltre a suggerire che sono necessari indici. Mostrerà i passi che il database sta prendendo per eseguire la query, in modo da sapere quali bit stanno prendendo il tempo più lungo.

Una cosa che non ho visto ancora citato qui è che quando si dispone di più di un disco che probabilmente vuole mettere l'indice su un disco diverso da quello in cui i dati sono in realtà a. Questo può accelerare alcune operazioni in su. Credo che questo merita una domanda in un suo tho destra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top