Qual è la differenza tra ottimizzare la tabella e analizzare la tabella in mysql


29

Qual è la differenza tra ottimizzare la tabella e analizzare la tabella in mysql? Ho letto i documenti online, ma non sono sicuro di quale sia la differenza.

Risposte:


28

Per espandere la risposta di @ MitchWheat (+1 per la prima risposta diretta):

TABELLA ANALISI esamina la distribuzione delle chiavi e le memorizza in INFORMATION_SCHEMA.STATISTICS .

OPTIMIZE TABLE esegue ANALYZE TABLE dopo aver eseguito la compressione della tabella. L'equivalente diOPTIMIZE TABLE mydb.mytable;se la tabella fosse MyISAM è questo:

ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;

MyISAM

Per la tabella MyISAM mydb.mytable in datadir /var/lib/mysql, sono disponibili i seguenti file:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.MYD (dati)
  • /var/lib/mysql/mydb/mytable.MYI (indici)

OPTIMIZE TABLE mydb.mytableridurrebbe i file .MYDe .MYIper la tabella.

Questo non è lo stesso per InnoDB. Ecco come è diverso:

InnoDB ( innodb_file_per_table abilitato)

I dati e gli indici di ogni tabella sono memorizzati in un file tablespace esterno. Per datadiris /var/lib/mysql e la tabella mydb.mytable, sarebbe memorizzato come segue:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

Quando OPTIMIZE TABLE mydb.mytableviene eseguito, mytable.ibdsi restringe.

InnoDB ( innodb_file_per_table disabilitato)

Solo /var/lib/mysql/mydb/mytable.frmesisterebbe. Tutti i dati e le pagine di indice per la tabella mydb.mytablesono memorizzati nel file tablespace di sistema /var/lib/mysql/ibdata1.

Quando OPTIMIZE TABLE mydb.mytableviene eseguito, le pagine dei dati e dell'indice vengono scritte contigue in ibdata1. Sfortunatamente, questo fa crescere ibdata1 a passi da gigante.

Vedere la Rappresentazione pittorica del CTO di Percona Vadim Tkachenko

Impianto idraulico InnoDB

AGGIORNAMENTO 2013-02-26 22:33 EST

Il tuo commento è stato

Penso che l'ottimizzazione della tabella per innodb non sia supportata. Ho ricevuto un messaggio, l'indice verrà ricreato. Come funziona?

L'ho provato

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)

mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> analyze table dat;
+----------+---------+----------+----------+
| Table    | Op      | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status   | OK       |
+----------+---------+----------+----------+
1 row in set (0.06 sec)

mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)

mysql>

Hai ragione. Non è possibile eseguire OPTIMIZE TABLEcome singola operazione. Quello che fa InnoDB invece è il seguente:

ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;

Puoi anche eseguire questi passaggi da solo.

Tuttavia, in tutta onestà, non è necessario eseguire ANALYZE TABLEuna tabella InnoDB poiché ogni volta che viene eseguita una query, il motore di archiviazione InnoDB esegue una stima sulla cardinalità della tabella in base al passaggio tra le pagine degli indici. Se ci sono un elevato numero di INSERTs, UPDATEs, e DELETEs, quindi sarà necessario ANALYZE TABLE. Quando è presente un numero elevato di DELETEs, ALTER TABLE mydb.mytable ENGINE=InnoDB;è necessario ridurre la tabella.

In realtà ho scritto post sulla futilità di ANALYZE TABLEInnoDB in alcuni casi:


Penso che l'ottimizzazione della tabella per innodb non sia supportata. Ho ricevuto un messaggio, l'indice verrà ricreato. Come funziona?
Booleano il

@RolandoMySQLDBA Non sono sicuro di cosa significhi quando dici "non puoi correre OPTIMIZE TABLE". Quando OPTIMIZE TABLEesegui una tabella InnoDB, MySQL esegue le operazioni ALTER TABLE ... ENGINE=InnoDBe ANALYZE TABLE ...per te quando dice "facendo invece ricreare + analizza tabella".
Michael - sqlbot,

@ Michael-sqlbot Come mostrato nella mia risposta, ho eseguito OPTIMIZE TABLE dat;MySQL 5.5.29 e si è subito lamentato Table does not support optimize, doing recreate + analyze instead. Ecco perché lo consiglio ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;.
RolandoMySQLDBA,

Giusto, ma direi che è successo immediatamente perché il tavolo su cui hai provato era molto piccolo. Quando sei OPTIMIZE TABLEsu InnoDB, il server effettivamente esegue ALTER TABLE ... ENGINE=InnoDBe ANALYZE TABLEdietro le quinte prima di restituire quella risposta ... quindi puoi effettivamente eseguire OPTIMIZE TABLEsu InnoDB e ottenere l'effetto desiderato.
Michael - sqlbot,

15

Dipende dalla tua versione di MySQL e dal motore di archiviazione, ma in generale:

OTTIMIZZA TABELLA Analizza la tabella, memorizza la distribuzione delle chiavi per una tabella, recupera lo spazio inutilizzato e deframmenta il file di dati.

TABELLA ANALISI Analizza solo la tabella e memorizza la distribuzione delle chiavi.

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.