Avantages de l'exécution de la requête OPTIMIZE TABLE dans MySQL DB Server

9

Je voudrais savoir quels sont les avantages [vraiment pratiques] qui peuvent être récoltés en exécutant la OPTIMIZE TABLE tbl_namerequête dans MySQL Server.

J'ai vérifié cela une fois et j'ai constaté qu'après cette exécution, le prochain hit DB prend beaucoup de temps peut être dû à la relocalisation de fragments, mais les hits suivants montrent une sorte de performance, je ne sais pas si la mise en cache des requêtes fait cette astuce avec l'optimisation ou l'optimisation seule fait cette astuce.

Quelqu'un peut-il me guider avec des valeurs de différence de performances réelles si possible afin que je puisse aller plus loin, car travailler avec MySQL gagne en gravité dans notre projet.

Saravanan
la source

Réponses:

7

N'oubliez pas qu'OPTIMIZE TABLE n'effectue pas de défragmentation. En interne, OPTIMIZE TABLE effectue plusieurs opérations (copie de données dans un fichier temporaire, recréation d'index, recalcul des statistiques d'index). En fait, l'exemple que je possède peut être exécuté manuellement comme indiqué.

Exemple: si vous optimisez mydb.mytable, vous entrez cette commande:

OPTIMIZE TABLE mydb.mytable;

Notez que mysql effectue quelque chose de ce qui suit sous le capot:

CREATE TABLE mydb.mytable2 LIKE mydb.mytable;
ALTER TABLE mydb.mytable2 DISABLE KEYS;
INSERT INTO mydb.mytable2 SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable2 ENABLE KEYS;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytable2 RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;

Ceci est très utile pour les tableaux qui connaissent un volume élevé de mises à jour et de suppression

Cette opération peut accomplir deux choses

  1. Empêchez mysql de parcourir les fragments d'une table pour tenter de charger des données dans les fragments de bonne taille. L'élimination de ces fragments réduira cette opération.

  2. Le fait de recalculer les statistiques d'index aide MySQL Query Optimizer à construire de meilleurs plans EXPLAIN. Sinon, les requêtes peuvent se détériorer dans le temps d'exécution car l'optimiseur de requêtes MySQL a décidé de faire de mauvaises suppositions sur le plan EXPLAIN. Ce serait un symptôme certain d'une table qui a eu un volume élevé de mises à jour et de suppression.

CAVEAT

En ce qui concerne la mise en cache, la mise en cache prend une plongée rapidement en raison d'une analyse complète de la table. Pour les pages d'index MyISAM, elles entrent et sortent du cache de clés MyISAM. Pour InnoDB, les pages de données et d'index entrent et sortent du pool de tampons InnoDB.

RolandoMySQLDBA
la source
Merci pour votre réponse. De votre point de vue, je comprends que je ferais mieux d'utiliser un service comme un travail cron pour planifier l'optimisation de la table pour l'une de mes tables fréquemment mises à jour afin que je puisse obtenir de meilleures performances. De plus, j'utilise InnoDB pour ce tableau. Est-ce un meilleur choix. En outre, je trouve que les jointures HASH dans SQL Server ont été suggérées pour améliorer les performances des requêtes, pouvez-vous s'il vous plaît expliquer cela pour moi et comment en obtenir une similaire à MySQL. Veuillez également me donner un optimiseur de requête SQL pour MySQL [version Windows7].
Saravanan
@savaranan: L'optimiseur de requêtes MySQL auquel je faisais référence était celui interne intégré à MySQL. BTW Étant donné que la table que vous souhaitez optimiser est InnoDB, vous pouvez ignorer les étapes DISABLE KEYS et ENABLE KEYS. De plus, ANALYZE TABLE peut être ignoré car il est totalement inutile sur les tables InnoDB car InnoDB recalcule ses cardinalités de table par des approximations proches en utilisant les pages des index BTREE, appelées plongées d'index.
RolandoMySQLDBA
@savaranan: En ce qui concerne les index HASH, InnoDB a des index de hachage adaptatifs ( dev.mysql.com/doc/refman/5.5/en/innodb-adaptive-hash.html ). Il y a aussi de bonnes suggestions pour émuler vos propres index de hachage et gérer les collisions basées sur les pages 103-106 de "MySQL haute performance" ( amazon.com/dp/0596101716 )
RolandoMySQLDBA