Domanda Indice per più colonne in ActiveRecord


In ActiveRecord esistono due modi per dichiarare gli indici per più colonne:

add_index: classificazioni, [: species,: family,: trivial_names]
add_index: classificazioni,: specie
add_index: classificazioni,: famiglia
add_index: classificazioni,: trivial_names

C'è qualche differenza tra il primo approccio e il secondo? Se è così, quando dovrei usare il primo e quando il secondo?


44
2018-06-26 12:36


origine


risposte:


Stai confrontando un indice composito con un insieme di indici indipendenti. Sono solo diversi.

Pensala in questo modo: un indice composto ti dà una rapida ricerca del primo campo in un insieme di campi nidificati seguito da una rapida ricerca del secondo campo entro SOLO i record già selezionati dal primo campo, seguito da una rapida ricerca del terzo campo - di nuovo, solo all'interno dei record selezionati dai precedenti due indici.

Prendiamo un esempio. Il tuo motore di database non richiederà più di 20 passaggi per individuare un valore univoco entro 1.000.000 di record (se la memoria serve) Se stai usando un indice. Questo è vero sia che tu stia usando un indice composito o indipendente, ma SOLO per il primo campo ("specie" nel tuo esempio, anche se penserei che tu voglia Famiglia, Specie e poi Nome comune).

Ora, diciamo che ci sono 100.000 record corrispondenti per questo primo valore di campo. Se si hanno solo indici singoli, qualsiasi ricerca all'interno di questi record richiederà 100.000 passaggi: uno per ogni record recuperato dal primo indice. Questo perché il secondo indice non verrà utilizzato (nella maggior parte dei database - questo è un po 'di semplificazione) e deve essere utilizzata una corrispondenza forza bruta.

Se hai un indice composito quindi la tua ricerca è molto più veloce perché la tua seconda ricerca sul campo avrà un indice entro il primo insieme di valori. In questo caso non occorrono più di 17 passaggi per ottenere il primo valore di corrispondenza sul campo 2 entro le 100.000 corrispondenze sul campo 1 (base di log 2 su 100.000).

Quindi: passaggi necessari per trovare un record univoco di un database di 1.000.000 di record utilizzando un indice composito su 3 campi nidificati in cui il primo recupera 100.000 e il secondo recupera 10.000 = 20 + 17 + 14 = 51 passi.

Passi necessari nelle stesse condizioni con soli indici indipendenti = 20 + 100.000 + 10.000 = 110.020 passi.

Grande differenza, eh?

Adesso, non impazzire mettendo indici compositi ovunque. Innanzitutto, sono costosi su inserti e aggiornamenti. In secondo luogo, vengono affrontati solo se si sta veramente cercando tra i dati annidati (per un altro esempio, li uso quando si estraggono i dati per gli accessi per un client in un determinato intervallo di date). Inoltre, non valgono la pena se si lavora con insiemi di dati relativamente piccoli.

Infine, controlla la documentazione del tuo database. I database sono diventati estremamente sofisticati nella capacità di implementare gli indici in questi giorni e lo scenario Database 101 descritto sopra potrebbe non valere per alcuni (anche se sviluppo sempre come se fosse così solo io so cosa sto ottenendo).


87
2018-06-26 14:17



I due approcci sono diversi. Il primo crea un indice singolo su tre attributi, il secondo crea tre indici a attributi singoli. I requisiti di archiviazione saranno diversi, anche se senza distribuzioni non è possibile dire quale sarebbe più grande.

L'indicizzazione di tre colonne [A, B, C] funziona bene quando è necessario accedere ai valori di A, A + B e A + B + C. Non sarà utile se la tua query (o le condizioni di ricerca o qualsiasi altra cosa) non fa riferimento a A.

Quando A, B e C sono indicizzati separatamente, alcuni ottimizzatori di query DBMS considereranno la combinazione di due o più indici (soggetto alla stima dell'efficienza dell'ottimizzatore) per fornire un risultato simile a un singolo indice a più colonne.

Supponiamo che tu abbia un sistema di e-commerce. Si desidera interrogare gli ordini per data dell'acquisto, id_cliente e talvolta entrambi. Inizerei con la creazione di due indici: uno per ciascun attributo.

D'altra parte, se si specifica sempre purchase_date e customer_id, quindi un singolo indice su entrambe le colonne sarebbe probabilmente il più efficiente. L'ordine è significativo: se si desidera eseguire query sugli ordini per tutte le date per un cliente, quindi rendere customer_id la prima colonna dell'indice.


10
2018-06-26 13:40



Dai documenti:

Quando si crea un indice su più   colonne, la prima colonna è usata come   nome per l'indice. Ad esempio, quando   si specifica un indice su due colonne   [: first,: last], il DBMS crea un   indice per entrambe le colonne e un   indice per la prima colonna: primo.   Usando solo il primo nome per questo   l'indice ha un senso, perché lo farai   mai creare un indice singolare   con questo nome

Utilizzare il primo metodo quando si crea un indice composto e il secondo quando si creano indici su singoli attributi.

Ci sono alcuni punti positivi qui su quando utilizzare gli indici composti, ma il succo è che sono buoni quando si utilizza un dove su più attributi. Nota che dovrebbero essere usati insieme ad altri indici (indicizza sempre le tue chiavi straniere) - non in sostituzione.


1
2018-06-26 12:41