286 votes

MySQL OPTIMISE toutes les tables ?

MySQL dispose d'un OPTIMISER LA TABLE qui peut être utilisée pour récupérer l'espace inutilisé dans une installation MySQL. Existe-t-il un moyen (commande intégrée ou procédure stockée commune) d'exécuter cette optimisation pour chaque table de la base de données et/ou de l'installation du serveur, ou est-ce quelque chose que vous devriez script mettre en place vous-même ?

12 votes

Attention, cela ne permet pas nécessairement de récupérer de l'espace. Si vous utilisez InnoDB avec un seul fichier (probablement la configuration la plus courante de nos jours) plutôt que des fichiers séparés par table, vous utiliserez toujours la même quantité d'espace disque à la fin. En fait, j'ai vu que cela utilisait beaucoup plus d'espace disque lorsque tout était dit et fait. Avec les grandes tables, la table peut également être verrouillée pendant une très longue période.

1 votes

OPTIMIZE TABLE a été utile pour MyISAM. Maintenant que ce moteur est en train de disparaître, le besoin de OPTIMIZE TABLE disparaît, notamment la nécessité d'optimiser périodiquement toutes les tables.

1 votes

+1 pour la bonne info rick -- mais étant donné les pratiques standard du monde réel en matière de bases de données, je ne serais pas surpris que les anciennes tables MyISAM restent en place pendant une autre décennie.

464voto

Ike Walker Points 21162

Vous pouvez utiliser mysqlcheck pour faire cela à la ligne de commande.

Une base de données :

mysqlcheck -o <db_schema_name>

Toutes les bases de données :

mysqlcheck -o --all-databases

0 votes

Recommanderiez-vous de programmer l'exécution de cette commande au moins une fois par mois ?

12 votes

Bonjour @Gaia. Pas nécessairement. Optimiser toutes les tables sur un calendrier donné n'est pas bénéfique pour tout le monde. Jetez un coup d'œil à cet article et lisez les commentaires pour une réflexion beaucoup plus approfondie sur ce sujet que celle que je peux fournir dans un espace limité ici : xaprb.com/blog/2010/02/07/…

0 votes

Plutôt "probablement pas", à moins que vous n'évitiez les grandes tables et que vous sachiez quelles tables sont InnoDB ou MyISAM.

35voto

Ismael Miguel Points 231

J'ai fait ce 'simple' script :

set @tables_like = null;
set @optimize = null;
set @show_tables = concat("show tables where", ifnull(concat(" `Tables_in_", database(), "` like '", @tables_like, "' and"), ''), " (@optimize:=concat_ws(',',@optimize,`Tables_in_", database() ,"`))");

Prepare `bd` from @show_tables;
EXECUTE `bd`;
DEALLOCATE PREPARE `bd`;

set @optimize := concat('optimize table ', @optimize);
PREPARE `sql` FROM @optimize;
EXECUTE `sql`;
DEALLOCATE PREPARE `sql`;

set @show_tables = null, @optimize = null, @tables_like = null;

Pour l'exécuter, il suffit de le coller dans n'importe quel IDE SQL connecté à votre base de données.

Remarque : ce code NE FONCTIONNE PAS sur phpmyadmin.

Comment cela fonctionne

Elle gère un show tables et le stocke dans une déclaration préparée. Ensuite, il exécute un optimize table dans l'ensemble sélectionné.

Vous pouvez contrôler les tableaux à optimiser en définissant une valeur différente dans la variable @tables_like (par exemple : set @tables_like = '%test%'; ).

5 votes

Mon environnement d'hébergement partagé ne dispose pas de "mysqlchk", ce qui me permettrait d'exécuter cette opération directement à partir d'une session de terminal "mysql". Je vous remercie !

0 votes

Vous êtes les bienvenus. J'utilise ce code pour optimiser 50 bases de données et passer le moins de temps possible. Si vous pensez que je peux améliorer le code de quelque manière que ce soit, n'hésitez pas à me faire part de vos suggestions. Je serai heureux d'améliorer ce précieux morceau de code.

0 votes

Préparer bd de @b Code d'erreur : 1064. Vous avez une erreur dans votre syntaxe SQL ; consultez le manuel correspondant à votre version du serveur MySQL pour connaître la syntaxe à utiliser près de 'NULL' à la ligne 1.

24voto

Dmitriy Naumov Points 2084

L'exemple suivant de php script peut vous aider à optimiser toutes les tables de votre base de données.

<?php

dbConnect();

$alltables = mysql_query("SHOW TABLES");

while ($table = mysql_fetch_assoc($alltables))
{
   foreach ($table as $db => $tablename)
   {
       mysql_query("OPTIMIZE TABLE '".$tablename."'")
       or die(mysql_error());

   }
}

?>

8 votes

Sur une base de données comportant 200 tables, vous allez exécuter 200 requêtes distinctes en optimisant une table à la fois. Vous devriez imploser les noms des tables en une seule chaîne de caractères et donc une seule requête d'optimisation de table est nécessaire.

8 votes

Je me demande si l'approche des requêtes séparées n'est pas parfois meilleure. MySQL dit que les tables sont verrouillées pendant l'exécution d'OPTIMIZE TABLE. Il semblerait alors plus sage d'optimiser chacune d'entre elles à la fois pour laisser le serveur acquérir les verrous pendant le minimum de temps. Évidemment, c'est pour un serveur auquel on accède régulièrement. Sinon, je pense qu'une seule requête est la meilleure approche.

0 votes

À quoi ressemblerait le script si vous l'implantiez et le transformiez en une seule requête ? Merci.

11voto

Muni Points 11

Pour toutes les bases de données :

mysqlcheck -Aos -uuser -p 

Pour une optimisation de la base de données :

mysqlcheck -os -uroot -p dbtest3

0 votes

Au moins pour moi, sous Linux, la commande mysqlcheck -Aos ne requiert pas d'utilisateur ni de mot de passe.

4voto

Vous pouvez optimiser/vérifier et réparer toutes les tables de la base de données, en utilisant le client mysql.

Tout d'abord, vous devez obtenir la liste de toutes les tables, séparées par des ',' :

mysql -u[USERNAME] -p[PASSWORD] -Bse 'show tables' [DB_NAME]|xargs|perl -pe 's/ /,/g'

Maintenant, quand vous avez la liste de toutes les tables pour l'optimisation :

mysql -u[USERNAME] -p[PASSWORD] -Bse 'optimize tables [tables list]' [DB_NAME]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X