Domanda

Ho creato un nuovo indice su un tavolo con 35million record e il suo stato in esecuzione per quasi 1 giorno all'altro. In precedenza, quando ho creato gli indici ci sono voluti 20 minuti, ci colonne sono state tuttavia galleggianti. Il nuovo idnex è su un varchar (45)

ho usato il comando PROCESSLIST che mostra la creazione indice è ancora in corso con il seguente output

65417 | Repair with keycache | CREATE INDEX insert_index on checkins(dateinserted)

Mi chiedevo se qualcuno mi potrebbe dare consigli su come trovare fuori se la query è in realtà morta e è appena seduto nella lista dei processi. Forse qualcosa è sbagliato andato a un certo punto e io non sono a conoscenza.

Grazie

È stato utile?

Soluzione

Il tuo indice sta costruendo, ma molto lentamente.

MySQL ha due metodi disponibili per la costruzione di indici:

  1. di classificare. Questo è il metodo più veloce, ma utilizza un sacco di memoria.
  2. di cache delle chiavi. Lento, lento, lento -. Poca memoria, ma consuma

Il metodo cache delle chiavi è un po 'come per inserzione: valori vengono inseriti nell'indice uno alla volta. Questo è lo stesso metodo usato dal server quando l'istruzione INSERT viene utilizzata per aggiungere righe alla tabella.

Il metodo di ordinamento ordina tutti i valori utilizzando il Quicksort, e poi costruisce l'indice da quello. E 'molto veloce, ma richiede un sacco di memoria e spazio su disco temporaneo.

Alcune variabili del server può aumentare lo spazio disponibile per il metodo di ordinamento, e così permettergli di lavorare con tavoli più grandi. Vedere myisam_max_sort_file_size

http: //dev.mysql. com / doc / refman / 5.1 / it / server-system-variables.html # sysvar_myisam_max_sort_file_size

Su Linux, è possibile monitorare lo stato di avanzamento della riparazione dell'indice controllando la dimensione dei file temporanei che vengono utilizzati per costruire l'indice. Il seguente comando elencherà tutti i documenti in possesso aperti dal processo di MySQL:

sudo ls -l /proc/[mysql-pid]/fd  

Poi controlla le dimensioni di quelli con hash nel loro nome -. Questi sono i file temporanei

Altri suggerimenti

Tenete a mente la dimensione indice sarà 35M * 45 almeno. Se si tratta di una colonna utf8 allora sarà 35M * 45 * 3. Questo è più di 4 concerti! Se non si dispone di tonnellate di RAM per il supporto che sta andando ad avere a che fare un sacco di accesso al disco e davvero uccidere le prestazioni.

Can si normalizzare questa colonna fuori in un'altra tabella?

Se non lo fanno i valori tendono a variare con sufficiente dire che i primi 8 caratteri? Potreste essere in grado di cavarsela con solo l'indicizzazione del primo 8 poi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top