2014-10-23 12 views
20

Se sto usando soft delete in laravel 4.2 (il database è mysql), ogni query eloquente creata ha WHERE deleted_at IS NULL. Non ci sono indici su deleted_at.Il "soft_delete" di Laravel ha bisogno dell'indice su MySQL?

  • Sarà lento sui grandi tavoli? (o forse IS NULL è ottimizzato senza indice)
  • Devo aggiungere indice su soft_delete?

Quindi, il "soft_delete" di Laravel ha bisogno dell'indice su MySQL?

+1

Non ha bisogno di un indice. Se è nullo, non viene eliminato. Se ha un valore, viene eliminato. Ciò significa che ha due valori possibili per funzionare. Le colonne con due valori utilizzabili non sono buoni candidati indice - la loro cardinalità sta convergendo a 0. Pertanto, l'deleted_at non ha bisogno di un indice. –

+0

Ok, grazie. Ho pensato che quasi ogni clausola 'where' deve essere indicizzata. Puoi postare il tuo commento come risposta, se vuoi. –

risposta

37

La colonna deleted_at non è un buon candidato indice. Cercherò di spiegare meglio rispetto al commento: gli indici sono utili solo quando la loro cardinalità è relativamente alta. La cardinalità è un numero che descrive l'unicità dell'indice nel set di dati. Ciò significa che è il numero totale di record diviso per i record univoci totali.

Ad esempio, la cardinalità della chiave primaria è 1. Ogni record contiene un valore univoco per la chiave primaria. 1 è anche il numero più alto. Puoi considerarlo come un "100%".

Tuttavia, una colonna come deleted_at non ha un valore simile. Cosa fa Laravel con deleted_at è controllare se è o non è nullo. Ciò significa che ha due valori possibili. Le colonne che contengono due valori hanno una cardinalità estremamente bassa che diminuisce con il crescere del numero di record.

È possibile indicizzare una colonna di questo tipo, ma non sarà di alcun aiuto. Quello che accadrà è che potrebbe rallentare le cose e occupare spazio.

TL; DR: no, non è necessario indicizzare tale colonna, l'indice non avrà alcun impatto positivo sulle prestazioni.

+0

Risposta utile e chiara; accettato. –

+0

Significa che non c'è motivo di indicizzare una colonna booleana o sto interpretando male? –

+0

@Cabloo: non stai interpretando male, ogni colonna che ha un piccolo intervallo di valori univoci è un candidato indice errato, anche se hai un 'tinyint' i cui valori sono' 0' e '1'. –

Problemi correlati