Determinare lo stato di un indice in MySQL
-
27-09-2019 - |
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
Soluzione
Il tuo indice sta costruendo, ma molto lentamente.
MySQL ha due metodi disponibili per la costruzione di indici:
- di classificare. Questo è il metodo più veloce, ma utilizza un sacco di memoria.
- 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
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.