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%';
).
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 deOPTIMIZE 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.