Quelle est la différence entre optimiser la table et analyser la table dans mysql


29

Quelle est la différence entre optimiser la table et analyser la table dans mysql? J'ai lu les documents en ligne, mais je ne sais pas quelle est la différence.

Réponses:


28

Pour développer la réponse de @ MitchWheat (+1 pour répondre directement en premier):

ANALYZE TABLE examine la distribution des clés et les stocke dans INFORMATION_SCHEMA.STATISTICS .

OPTIMIZE TABLE exécute ANALYZE TABLE après avoir effectué une compression de table. L'équivalent deOPTIMIZE TABLE mydb.mytable;si la table était MyISAM est le suivant:

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

MyISAM

Pour la table MyISAM mydb.mytable dans datadir /var/lib/mysql, vous disposez des fichiers suivants:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.MYD (Les données)
  • /var/lib/mysql/mydb/mytable.MYI (index)

OPTIMIZE TABLE mydb.mytableréduirait les fichiers .MYDet .MYIpour la table.

Ce n'est pas la même chose pour InnoDB. Voici comment c'est différent:

InnoDB ( innodb_file_per_table activé)

Les données et index de chaque table sont stockés dans un fichier d'espace disque logique externe. Pour datadiris /var/lib/mysql et le tableau mydb.mytable, il serait stocké comme suit:

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

Quand OPTIMIZE TABLE mydb.mytableest exécuté, mytable.ibdse rétrécit.

InnoDB ( innodb_file_per_table désactivé)

Seul /var/lib/mysql/mydb/mytable.frmexisterait. Toutes les pages de données et d'index de la table mydb.mytablesont stockées dans le fichier d'espace disque logique système /var/lib/mysql/ibdata1.

Une fois OPTIMIZE TABLE mydb.mytableexécuté, les pages de données et d'index sont écrites de manière contiguë dans ibdata1. Malheureusement, cela fait que ibdata1 grandit à pas de géant.

Voir la représentation graphique de Percona CTO Vadim Tkachenko

Plomberie InnoDB

MISE À JOUR 2013-02-26 22:33 EST

Votre commentaire était

Je pense que l'optimisation de la table pour innodb n'est pas prise en charge. J'ai reçu un message, l'index sera recréé. Comment ça marche?

J'ai essayé

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>

Vous avez raison. Vous ne pouvez pas exécuter OPTIMIZE TABLEune seule opération. Ce que fait InnoDB à la place est le suivant:

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

Vous pouvez également exécuter ces étapes vous-même.

Cependant, en toute honnêteté, vous ne devriez pas avoir à exécuter ANALYZE TABLEune table InnoDB car chaque fois qu'une requête est exécutée, le moteur de stockage InnoDB effectue une estimation de la cardinalité de la table basée sur le passage des pages dans les index. S'il y a un grand nombre de INSERTs, UPDATEset DELETEs, alors vous devrez ANALYZE TABLE. Lorsqu'il y a un nombre élevé de DELETEs, il ALTER TABLE mydb.mytable ENGINE=InnoDB;faut alors réduire la table.

J'ai en fait écrit des articles sur la futilité d' ANALYZE TABLEInnoDB dans certains cas:


Je pense que l'optimisation de la table pour innodb n'est pas prise en charge. J'ai reçu un message, l'index sera recréé. Comment ça marche?
Boolean

@RolandoMySQLDBA Je ne sais pas ce que cela signifie lorsque vous dites "vous ne pouvez pas courir OPTIMIZE TABLE". Lorsque vous OPTIMIZE TABLEcréez une table InnoDB, MySQL effectue les opérations ALTER TABLE ... ENGINE=InnoDBet ANALYZE TABLE ...pour vous lorsqu'il dit "faire recréer + analyser la table à la place".
Michael - sqlbot

@ Michael-sqlbot Comme le montre ma réponse, je courais OPTIMIZE TABLE dat;dans MySQL 5.5.29 et immédiatement plaignais, Table does not support optimize, doing recreate + analyze instead. Voilà pourquoi je recommande ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;.
RolandoMySQLDBA

D'accord, mais je dirais que cela s'est produit immédiatement pour vous parce que le tableau contre lequel vous avez testé était très petit. Lorsque vous OPTIMIZE TABLEutilisez InnoDB, le serveur exécute en fait ALTER TABLE ... ENGINE=InnoDBet ANALYZE TABLEdans les coulisses avant de renvoyer cette réponse ... afin que vous puissiez en effet exécuter OPTIMIZE TABLEsur InnoDB et obtenir l'effet escompté.
Michael - sqlbot

15

Dépend de votre version de MySQL et du moteur de stockage mais en général:

OPTIMISER LA TABLE Analyse la table, stocke la distribution des clés d'une table, récupère l'espace inutilisé et défragmente le fichier de données.

ANALYSER LA TABLE Analyse uniquement la table et stocke la distribution des clés.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.