Cosa significa "La tabella non supporta l'ottimizzazione, ma invece ricreare + analizzare"?


97

Sto lavorando su MySQL 5.5 e sto provando a ricostruire l'indice usando una OPTIMIZE TABLEquery. Ricevo l'errore seguente:

La tabella non supporta l'ottimizzazione, ma ricrea + analizza

Cosa significa questo? Il motore MySQL non consente la ricostruzione dell'indice? Cosa si sta facendo dietro questo messaggio, a livello di motore MySQL 5.5?

Risposte:


190

Questo è davvero un messaggio informativo.

Probabilmente stai facendo OPTIMIZE su una tabella InnoDB (tabella che utilizza il motore di archiviazione InnoDB, piuttosto che il motore di archiviazione MyISAM ).

InnoDB non supporta l'OTTIMIZZAZIONE come fa MyISAM. Fa qualcosa di diverso. Crea una tabella vuota e copia tutte le righe dalla tabella esistente al suo interno, elimina essenzialmente la vecchia tabella e rinomina la nuova tabella, quindi esegue un'ANALISI per raccogliere le statistiche. Questo è il massimo che InnoDB può arrivare a fare un OTTIMIZZAZIONE.

Il messaggio che stai ricevendo è fondamentalmente il server MySQL che ripete ciò che il motore di archiviazione InnoDB ha detto al server MySQL:

La tabella non supporta l'ottimizzazione è il motore di archiviazione InnoDB che dice ...

"Io (il motore di archiviazione InnoDB) non eseguo un'operazione di OTTIMIZZAZIONE come fa il mio amico (il motore di archiviazione MyISAM)."

"invece di ricreare + analizzare" è il motore di memorizzazione InnoDB che dice ...

"Ho deciso di eseguire una serie diversa di operazioni che consentiranno di ottenere un risultato equivalente".


13
ok, potresti condividere il modo diverso che stai facendo.
Vikrant More

Sono sicuro che questo sia nel MySQL Reference Manual da qualche parte; questo è un comportamento previsto e nulla di cui preoccuparsi. (Tranne che la tabella sarà "bloccata" e non sarà disponibile mentre il processo viene completato, il che può richiedere del tempo per una tabella HUGH JASS.) Riferimento: https://dev.mysql.com/doc/refman/5.5/ it / optim-table.html Vedi la sezione "Dettagli InnoDB".
spencer7593

Puoi anche utilizzare MySQL Workbench per eseguire l'ottimizzazione della tabella. Per ulteriori informazioni, consultare la documentazione di Schema and Table Inspector . Notare l'opzione "Ottimizza tabella".
Philip Olson

1
Ottima spiegazione per le persone che stanno iniziando nel mondo db. Grazie mille
tachomi

5
Attenzione: non utilizzare questa opzione se lo spazio su disco è insufficiente poiché è probabile che il server si esaurisca nel tentativo di ricreare la tabella molto grande.
Danny Staple,

22

OPTIMIZE TABLEfunziona bene con il motore InnoDB secondo l'articolo di supporto ufficiale: http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

Noterai che l'ottimizzazione delle tabelle InnoDB ricostruirà la struttura della tabella e aggiornerà le statistiche dell'indice (qualcosa di simile ALTER TABLE).

Tieni presente che questo messaggio potrebbe essere solo una menzione informativa e l'informazione molto importante è lo stato della tua query: OK!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

2
Non proprio, MySQL fornirà il motivo dell'errore: errore di scrittura del file temporaneo, operazione non riuscita.
vento

9

L'opzione migliore è creare una nuova tabella con le stesse proprietà

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

Rinomina NEW.NAME.TABLE e TABLE.CRASH

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

Dopo aver lavorato bene, elimina

DROP TABLE <TABLE.CRASHED.BACKUP>;

1
Questo metodo mantiene indici e trigger?
Joel Murphy

1
Sì, naturalmente. Tutti loro! Puoi provarlo, quindi utilizzare phpMyAdmin per ricontrollare
tquang

Questo non ricrea la chiave esterna.
DanB

1

L'opzione migliore è creare una nuova tabella, copiare le righe nella tabella di destinazione, rilasciare la tabella effettiva e rinominare la tabella appena creata. Questo metodo è buono per i piccoli tavoli,


3
Suggerirei di mettere insieme un codice di esempio per accompagnare la tua risposta. Dai un'occhiata a come scrivo una buona risposta
Frits
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.