Récupère la place perdu dans une base de données mysql

3/5 (5 avis)

Snippet vu 4 384 fois - Téléchargée 19 fois

Contenu du snippet

En supprimant des données dans une table MySQL on se retrouve avec de la place perdue. Dans phpMyAdmin, la liste des tables contient la colonne "Perte" qui indique la taille perdue.
Ce script permet donc d'optimiser toutes les tables d'une base de données et de gagner un peut de place

Source / Exemple :


$sql_serveur = "à renseigner"; // Serveur mySQL 
$sql_base = "à renseigner"; // Base de données mySQL 
$sql_login = "à renseigner"; // Login de connection a mySQL 
$sql_password = "à renseigner"; // Mot de passe pour mySQL

$lk = @mysql_connect($sql_serveur, $sql_login, $sql_password) or die(mysql_error
());
@mysql_select_db($sql_base, $lk) or die(mysql_error());
?> 
<html>
<head>
<title>Récupère la place perdu dans une base de données MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
//on prépare la requête
$sql = "OPTIMIZE TABLE ";
//on recherche toutes les données des tables
$req = mysql_query('SHOW TABLE STATUS', $lk);
while($data = mysql_fetch_assoc($req)) {
    //on regarde seulement les tables qui affichent des pertes
    if($data['Data_free'] > ) {
        //et on l'inclut si elle comporte des pertes
        $sql .= '`'.$data['Name'].'`, ';
        echo $data['Name'] . "<br>\n";
    }
}
//on enlève le ', ' de trop
$sql = substr($sql, , (strlen($sql)-2));
//et on optimise
mysql_query($sql, $lk);
mysql_close($lk);
?>
</body>
</html>

A voir également

Ajouter un commentaire Commentaires
Vonscott Messages postés 61 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 19 septembre 2011
18 oct. 2009 à 03:40
ouias, pas convaincu, peut etre utile pour des clients n'ayant pas acces au phpmyadmin.
Quant au niveau initié, faudrait voir à pas pousser mémé dans les orties non plus, un code de débutant que l'on trouve partout.
Une page html pour ca ? Le code aurait pu etre integrer dans une fonction appellée par la page.
mountainmagazin Messages postés 6 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 29 décembre 2008
12 oct. 2009 à 09:18
Pour retirer un virgule en fin de chaine, tu peux utiliser :

rtrim ( $sql, ", ");
pgassie Messages postés 12 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 13 décembre 2006
11 oct. 2009 à 22:25
Certainement des problèmes d'éditeur font que le code proposé ne marche pas.
J'ai donc ré-écrit le code suivant :
------------------------------------------------------------------------
<?php
//utilisation http://localhost/[test]/optibase.php[?b= mabase]
// [test] étant l'allias de votre connexion PHP locale

// Serveur mySQL à renseigner
$serveur = "localhost";
// Base de données mySQL à renseigner
if((isset($_GET['b']))&&(!empty($_GET['b'])))$base = $_GET['b']; else $base = "mysql";
// Login de connexion à renseigner
$utilisateur = "root";
// Mot de passe pour mySQL à renseigner
$mot_de_passe = "";
?>
<html>
<head>
<title>Récupère la place perdue dans une base de données MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>
table, td, th {border:4px inset grey;margin:0 auto;}
h1 {text-align:center;}
</style>
</head>

Optimisation de la Base <?php echo $base ;?>

Nom de la table |Place perdue |Traitée |
<?php
$connexion = @mysql_connect($serveur, $utilisateur, $mot_de_passe)
or die(\"
\nCONTINUER\".mysql_error().\"\n\n</html> \");
//'retour.html' à renseigner
$ok=false;
//on prépare la requête
$requete= \"OPTIMIZE TABLE \";
//on recherche toutes les données des tables
$resultat = mysql_query('SHOW TABLE STATUS FROM '.$base.';');
while($ligne = mysql_fetch_assoc($resultat)) {
echo \"----
".$ligne['Name'] . ", ". $ligne['Data_free'].", ";
if($ligne['Data_free'] >0 ) {//on ne garde que les tables qui affichent des pertes
echo "oui, \n\";
$ok=true;
$requete .= '`'.$ligne['Name'].'`, ';
}else echo \"non</td>\n\";
}
echo"\n
\n";
//on enlève le ', ' de trop - peut-être à améliorer
$requete = substr($requete, 0, (strlen($requete)-2));
if ($ok) { //et on optimise
echo "
\n
\n
\nTraitement : `".$requete . "` effectué.
\n";
mysql_query($requete, $connection);
} else echo "
\n
\n
\nAucun traitement à faire.
\n";
mysql_close($connection);
?>

</html>
------------------------------------------------------------------------

Spécialement pour Vavavlp,j'ai amélioré la fonction die ( qui ne revenant pas, fabrique une page mal formée ).
Quelques autres petites astuces pour grands débutants.
J'utilise <table> qui n'est pas du tout "deprecated".
Inutile de gérer les lettres accentuées, ce programme est fait pour être en local ; par contre le $serveur peut commencer par "http:" et optimiser une base en ligne.

Plus là : http://www.phpcs.com/forum/sujet-SAVOIR-QUAND-ON-DOIT-OPTIMISER-TABLE-MYSQL_483594.aspx

Programmez, prenez de la peine...

Amusez-vous bien !
Vavavlp Messages postés 16 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 27 avril 2009
10 oct. 2009 à 11:36
Mince il y a pas de fonction édit ^^'

Là je sais pas si ça vient du code ou du site mais faudrait indenter aussi.
Vavavlp Messages postés 16 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 27 avril 2009
10 oct. 2009 à 11:35
But du code intéressant, pouvant être utile sur des sites utilisant le sql pour stocker des données temporaires.

Toutefois quelques remarques:
- Tu oublies le <?php de départ,
- die(mysql_error()); avant même d'avoir afficher la balise <html> :s
- mysql_ pdo serai mieux quand même,
- pas de xHTML,
- if($data['Data_free'] > ) on a le droit ?? faut pas un zéro (je suis pas sur jamais essayer ^^).

Voila avec ces quelques amélioration ça fera un code bien pratique ;)

Cordialement,
Vavavlp

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.