web-dev-qa-db-fra.com

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

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.

31
Boolean

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 de OPTIMIZE TABLE mydb.mytable; si la table était MyISAM est la suivante:

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.mytable réduirait le .MYD et .MYI fichiers pour 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 datadir est /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.mytable est exécuté, mytable.ibd se rétrécit.

InnoDB ( innodb_file_per_table désactivé)

Seulement /var/lib/mysql/mydb/mytable.frm existerait. Toutes les pages de données et d'index de la table mydb.mytable sont stockés dans le fichier d'espace de table système /var/lib/mysql/ibdata1.

Quand OPTIMIZE TABLE mydb.mytable est exé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 le Représentation picturale de Percona CTO Vadim Tkachenko

InnoDB Plumbing

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 courir OPTIMIZE TABLE en une 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 TABLE par rapport à une 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 nombre élevé de INSERTs, UPDATEs et DELETEs, alors vous devrez ANALYZE TABLE. Lorsqu'il y a un nombre élevé de DELETEs, alors ALTER TABLE mydb.mytable ENGINE=InnoDB; est nécessaire pour réduire la table.

J'ai en fait écrit des articles sur la futilité de ANALYZE TABLE sur InnoDB dans certains cas:

29
RolandoMySQLDBA

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

OPTIMIZE 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.

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

15
Mitch Wheat