2010-11-07 15 views
66

Sto passando un po 'di tempo ad ottimizzare il nostro attuale database.mysql troppi indici?

Sto guardando gli indici in particolare.

Ci sono alcune domande:

  • C'è una cosa come troppi indici?
  • Che accelereranno gli indici?
  • Cosa rallenteranno gli indici?
  • Quando è consigliabile aggiungere un indice?
  • Quando è una cattiva idea aggiungere un indice?
  • Pro e contro di più indici vs indici multi-colonna?

risposta

110

Che accelereranno gli indici?

Recupero dati - istruzioni SELECT.

Cosa rallenteranno gli indici?

Manipolazione dati: istruzioni INSERT, UPDATE, DELETE.

Quando è consigliabile aggiungere un indice?

Se si desidera ottenere prestazioni migliori per il recupero dei dati.

Quando è una cattiva idea aggiungere un indice?

Su tavoli che vedranno la manipolazione dei dati pesante - inserimento, aggiornamento ...

Pro e contro del più indici vs indici più colonne?

Le query devono risolvere l'ordine delle colonne quando si tratta di un indice di copertura (un indice su più di una colonna), da sinistra a destra nella definizione della colonna dell'indice. L'ordine delle colonne nell'istruzione non importa, solo quella di colonne 1, 2 e 3 - un'istruzione needs hanno un riferimento alla colonna 1 prima che l'indice può essere utilizzato. Se c'è solo un riferimento alla colonna 2 o 3, non è stato possibile utilizzare l'indice di copertura per 1/2/3.

In MySQL, un solo indice può essere utilizzato per SELECT/dichiarazione nella query (sottoquery/etc sono visti come una dichiarazione separata). E c'è un limite alla quantità di spazio per tabella che MySQL consente. Inoltre, l'esecuzione di una funzione una colonna indicizzata rende inutile l'indice - IE:

WHERE DATE(datetime_column) = ... 
+7

wow, questa informazione è davvero incredibilmente ben strutturata e molto utile! E il più utile per me è che un indice su cui viene applicata una funzione è inutile ... grazie per questa risposta! – Chris

+2

@OMG, Per quanto riguarda l'ultimo paragrafo, è possibile utilizzare più di un indice per 'select' a causa dell'indice di unione. http://www.percona.com/blog/2012/12/14/the-optimization-that-often-isnt-index-merge-intersection/ – Pacerier

+0

-1 per aver detto (1) accelera solo "SELECT", velocizza le query SELECT, UPDATE e DELETE, a condizione che gli indici siano creati correttamente in base alle condizioni "WHERE", ma richiede l'aggiornamento degli indici sulla manipolazione dei dati, il che significa che solo le query INSERT saranno più lente (in tutti i casi) di senza indici e (2) per dire che MySQL può usare solo un indice alla volta. –

4

C'è una cosa come troppi indici?

Sì.Non esca cercando di creare indici, creali come necessario.

Che accelereranno gli indici?

qualsiasi query sul tavolo indici/vista.

Cosa rallenteranno gli indici?

Qualsiasi istruzione INSERT sulla tabella indicizzata verrà rallentata, poiché ogni nuovo record dovrà essere indicizzato.

Quando è consigliabile aggiungere un indice?

Quando una query non è in esecuzione a una velocità accettabile. È possibile che si stia filtrando su record che non fanno parte del PK in cluster, nel qual caso è necessario aggiungere indici in base ai filtri su cui si sta effettuando la ricerca (se le prestazioni lo ritengono idoneo).

Quando è una cattiva idea aggiungere un indice?

quando lo si fa per il gusto di farlo - cioè eccesso di ottimizzazione.

Pro e contro di più indici vs indici multi-colonna?

Dipende dalle query che si sta tentando di migliorare.

7

Esiste un numero eccessivo di indici?

indici devono essere informati dal problema a portata di mano: i tavoli, le query l'applicazione verrà eseguito, ecc

Quali saranno gli indici accelerare?

SELEZIONA.

Cosa rallenteranno gli indici?

Gli INSERT saranno più lenti, poiché è necessario aggiornare l'indice.

Quando è consigliabile aggiungere un indice?

Quando l'applicazione richiede un'altra clausola WHERE.

Quando è una cattiva idea aggiungere un indice?

Quando non è necessario per interrogare o imporre vincoli di unicità.

Pro e Contro di più indici o indici multi-colonna?

Non capisco la domanda. Se si dispone di un vincolo di univocità che include più colonne, è assolutamente necessario modellarlo come tale.

3

Esiste un numero eccessivo di indici?

Yup, come tutte le cose, troppi indici rallentano la manipolazione dei dati.

Quando è consigliabile aggiungere un indice?

Una buona idea per aggiungere un indice è quando le tue query sono troppo lente (ad esempio hai troppi join nelle tue query). Dovresti utilizzare questa ottimizzazione solo dopo aver creato un modello solido, per ottimizzare le prestazioni.

48

Non sono d'accordo con alcune delle risposte a questa domanda.

Esiste un numero eccessivo di indici?

Naturalmente. Non creare indici non utilizzati da nessuna delle tue query. Non creare indici ridondanti. Usa strumenti come pt-duplicate-key-checker e pt-index-usage per aiutarti a scoprire gli indici che non ti servono.

Che accelereranno gli indici?

  • ricerca condizioni nella clausola WHERE.
  • Condizioni di adesione.
  • Alcuni casi di ORDER BY.
  • Alcuni casi di GROUP BY.
  • Vincoli UNICI.
  • vincoli FOREIGN KEY.
  • ricerca FULLTEXT.

Altre risposte hanno avvisato che INSERIRE/AGGIORNA/CANCELLA sono più lenti più gli indici si hanno. È vero, ma considera che molti usi di UPDATE e DELETE hanno anche clausole WHERE e anche in MySQL, UPDATE e DELETE supportano JOINs. Gli indici possono beneficiare queste query più che compensare il sovraccarico di aggiornamento degli indici.

Inoltre, InnoDB blocca le righe interessate da un UPDATE o DELETE. Chiamano questo blocco a livello di riga, ma è davvero un blocco a livello di indice. Se non c'è un indice per restringere la ricerca, InnoDB deve bloccare molte più righe rispetto alla riga specifica che stai modificando. Può anche bloccare tutte le le righe nella tabella. Questi blocchi bloccano le modifiche apportate da altri client, anche se non sono logicamente in conflitto.

Quando è consigliabile aggiungere un indice?

Se si sa che è necessario eseguire una query che trarrebbe vantaggio da un indice in uno dei casi precedenti.

Quando è una cattiva idea aggiungere un indice?

Se l'indice è un prefisso di sinistra di un altro indice esistente, o l'indice non aiuta nessuna delle query che è necessario eseguire.

Pro e contro di più indici vs indici multi-colonna?

In alcuni casi, MySQL può effettuare index-merge optimization, e sia l'unione o si intersecano i risultati di ricerche di indice indipendenti. Ma offre prestazioni migliori per definire un singolo indice in modo che non sia necessario eseguire l'unione con gli indici.

Per uno dei miei clienti di consulenza, ho definito un indice multi-colonna su una tabella molti-a-molti in cui non c'era alcun indice e ho migliorato la loro query di join di un fattore di 94 milioni!

La progettazione degli indici corretti è un processo complesso, basato su , le query necessarie per ottimizzare. Non devi fare regole generiche come "indicizza tutto" o "non indicizzare nulla per evitare di rallentare gli aggiornamenti".

Vedere anche la mia presentazione How to Design Indexes, Really.

+7

+1 per "... considera che molti usi di UPDATE e DELETE hanno anche clausole WHERE e anche in MySQL, UPDATE e DELETE supportano JOINs. Gli indici possono avvantaggiare queste query più che compensare il sovraccarico di aggiornamento degli indici." –

Problemi correlati