Aggiunta di un indice molto lento ... esiste un cmd mysql per ottenere un ETA o mostrare progressi?


13

Attualmente sto eseguendo una query di modifica sulla mia tabella (20 milioni di voci) per aggiungere un indice. funziona già da più di 3 giorni (bloccato su "copia nella tabella tmp").

c'è un modo per vedere lo stato di avanzamento della query o in altre parole c'è un modo per ottenere un tempo di stima del completamento?

Grazie.


4
MyISAM? InnoDB? Se InnoDB, il file per tabella è attivato?
Charles

Grande domanda - la cosa migliore che mi viene in mente all'istante è fare un'ipotesi approssimativa usando la dimensione dei file temporanei e reali grezzi - farà comunque qualche ricerca in più

Per favore SHOW CREATE TABLE tblname\Gsul tavolo e dicci l'indice che vuoi fare.
RolandoMySQLDBA

Risposte:


3

Quando mysql altera una tabella, ne fa sostanzialmente una copia e quindi scambia la copia. In questo modo se si annulla l'aggiornamento nel mezzo, la tabella è ancora in uno stato stabile. Quindi puoi guardare nella directory dei dati mysql (/ var / lib / mysql /?) Per vedere quanto è grande il nuovo file, che ti dirà quanto è lungo. Questo è un po 'più difficile con Innodb, ma da qualche parte viene creata una tabella tmp.

È possibile ridurre significativamente il tempo impiegato da un indice aumentando le variabili del buffer di ordinamento (myisam_sort_buffer_size, sort_buffer_size). Rendi quelli più grandi che puoi con la memoria che hai. Potresti tagliare alcuni giorni di tempo di modifica, anche ridurlo a poche ore a seconda di quanta memoria hai. Ho fatto una tabella record di 150 milioni in circa 3 ore.


Purtroppo non sono riuscito a trovare alcuna tabella tmp. Uso innoDB, con innodb_file_per_table impostato su OFF.

2

Poiché innodb_fle_per_table è OFF, non è possibile visualizzare la tabella e misurarla in corso.

Ho pubblicato un post precedente su come eseguire questa operazione per MyISAM . Puoi farlo per InnoDB se e solo se innodb_file_per_table è stato abilitato e cerchi nuovamente l'infrastruttura InnoDB . Richiede ancora di guardare nel sistema operativo le dimensioni dei file in questione.

Dopo aver implementato completamente InnoDB Cleanup e aver abilitato innodb_file_per_table, potresti voler eseguire l'aggiornamento dell'indice come segue:

ESEMPIO hai il seguente

  • Istanza MySQL con / var / lib / mysql come datadir
  • Tabella InnoDB chiamata db.lotsofdatacon 20 milioni di nomi:

La tabella è simile alla seguente:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Supponiamo di voler creare un indice dei nomi. Puoi farlo:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

Mentre INSERT è in esecuzione, vai nel sistema operativo ed esegui questo:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

Questo ti darà un elenco delle dimensioni attuali di lotsofdata_new.ibd. Quando diventa più grande di lotsofdata.ibd, allora sai che sei vicino al completamento.

BTW MariaDB ha uno stato di avanzamento implementato internamente .


grazie per il tuo feedback. per ora, ho deciso di terminare la query e riprovare dopo l'aggiornamento all'ultima versione di mysql. speriamo che andrà più agevolmente in quel modo.
Atai Voltaire,

1

Non esiste un modo affidabile per vedere l'avanzamento della creazione di un indice. Se avessi attivato il file innodb per tabella, potresti ottenere qualche indicazione guardando il file .ibd temporaneo che viene creato nella directory dei dati e confrontarlo con la dimensione del file corrente, ma non è molto affidabile, poiché il tuo file di dati corrente potrebbe essere gonfiato a causa di eliminazioni / frammentazione e il nuovo file di dati avrà un indice aggiuntivo rispetto al tuo precedente.

Sembra che tu stia utilizzando una versione di MySQL senza il plugin InnoDB installato. Il plug-in InnoDB ha una rapida creazione dell'indice che non richiede una ricostruzione completa della tabella per aggiunte ed eliminazioni di indici. Il plug-in InnoDB è abilitato per impostazione predefinita in MySQL 5.5 e disponibile con un'impostazione di configurazione in 5.1.38 e successive.

  • Quale versione di MySQL stai usando?

Percona Server in un certo senso (pre 5.5) ha il plugin InnoDB abilitato di default.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.