Dovresti assolutamente dedicare un po 'di tempo a leggere l'indicizzazione, c'è molto scritto su di esso ed è importante capire cosa sta succedendo.
In generale, un indice impone un ordinamento sulle righe di una tabella.
Per semplicità, immagina che una tabella sia solo un grosso file CSV. Ogni volta che viene inserita una riga, viene inserita alla fine . Quindi l'ordinamento "naturale" della tabella è solo l'ordine in cui sono state inserite le righe.
Immagina di avere quel file CSV caricato in un'applicazione di foglio di calcolo molto rudimentale. Tutto ciò che fa questo foglio di calcolo è visualizzare i dati e numerare le righe in ordine sequenziale.
Ora immagina di dover trovare tutte le righe con un valore "M" nella terza colonna. Dato ciò che hai a disposizione, hai solo un'opzione. Si esegue la scansione della tabella controllando il valore della terza colonna per ogni riga. Se hai molte righe, questo metodo (una "scansione della tabella") può richiedere molto tempo!
Ora immagina che oltre a questa tabella, hai un indice. Questo indice particolare è l'indice dei valori nella terza colonna. L'indice elenca tutti i valori della terza colonna, in un ordine significativo (diciamo, in ordine alfabetico) e per ciascuno di essi, fornisce un elenco di numeri di riga in cui appare quel valore.
Ora hai una buona strategia per trovare tutte le righe in cui il valore della terza colonna è "M". Ad esempio, è possibile eseguire una ricerca binaria ! Mentre la scansione della tabella richiede di guardare N righe (dove N è il numero di righe), la ricerca binaria richiede solo di guardare le voci dell'indice log-n, nel caso peggiore. Wow, questo è sicuramente molto più semplice!
Naturalmente, se si dispone di questo indice e si stanno aggiungendo righe alla tabella (alla fine, poiché è così che funziona la nostra tabella concettuale), è necessario aggiornare l'indice ogni volta. Quindi fai un po 'più di lavoro mentre scrivi nuove righe, ma risparmi un sacco di tempo quando cerchi qualcosa.
Quindi, in generale, l'indicizzazione crea un compromesso tra efficienza di lettura ed efficienza di scrittura. Senza indici, gli inserimenti possono essere molto veloci: il motore di database aggiunge solo una riga alla tabella. Quando si aggiungono indici, il motore deve aggiornare ciascun indice durante l'esecuzione dell'inserimento.
D'altra parte, le letture diventano molto più veloci.
Speriamo che copra le tue prime due domande (come hanno già risposto gli altri - devi trovare il giusto equilibrio).
Il tuo terzo scenario è un po 'più complicato. Se stai usando LIKE, i motori di indicizzazione in genere ti aiuteranno con la tua velocità di lettura fino al primo "%". In altre parole, se si sta selezionando DOVE COME la colonna "pippo% bar%", il database utilizzerà l'indice per trovare tutte le righe in cui la colonna inizia con "pippo", quindi è necessario eseguire la scansione del set di righe intermedio per trovare il sottoinsieme che contiene "bar". SELEZIONA ... DOVE LA colonna COME '% bar%' non può usare l'indice. Spero che tu possa capire perché.
Infine, è necessario iniziare a pensare agli indici su più di una colonna. Il concetto è lo stesso e si comporta in modo simile alle cose LIKE - essenzialmente, se si dispone di un indice su (a, b, c), il motore continuerà a utilizzare l'indice da sinistra a destra nel miglior modo possibile. Quindi una ricerca nella colonna a potrebbe usare l'indice (a, b, c), come farebbe per una (a, b). Tuttavia, il motore dovrebbe eseguire una scansione completa della tabella se si cercasse DOVE b = 5 AND c = 1)
Spero che questo aiuti a far luce, ma devo ribadire che è meglio spendere qualche ora a cercare buoni articoli che spieghino queste cose in profondità. È anche una buona idea leggere la documentazione del tuo particolare database server. Il modo in cui gli indici vengono implementati e utilizzati dai pianificatori di query può variare in modo abbastanza ampio.