Page 1 sur 2

requete pour optimiser une table

Posté : 21 févr. 2006, 15:19
par BeRoots
salut à tous :D

j'ai un petit problème de requete sql depuis php:
$sql_2 = "OPTIMIZE TABLE '$table'";
    $result_2 = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
aucun message d'erreur mais aucune optimisation de la table...

si quelqu'un peu m'aider :wink:

ps: à titre d'info, j'execute la requete suivante pour effacer des ligne precise avant d'effectuer l'optimisation
// on efface les lignes périmees de la table
    $sql = "DELETE FROM table_manif WHERE manif_date < '$verif_date'";
    $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    // on optimise la table
    $sql_2 = "OPTIMIZE TABLE '$table'";
    $result_2 = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

Posté : 21 févr. 2006, 15:53
par zeus
Qu'est-ce que tu vérifies pour voir l'optimisation ?

Posté : 21 févr. 2006, 16:17
par BeRoots
c'est une optimisation d'une table suite à un effacement de donnée périmer qui sera effectuer une fois par jour, à la premiere visite du site (si visite il y a ^^)

je verifie depuis phpmyadmin pour voir si l'optimisation à été faite mais j'ai toujours des pertes dans ma table :cry:

la variable $verif_date à été tesé par echo et m'affiche bien la date d'aujourd'hui au format AAAA-MM-DD

Posté : 21 févr. 2006, 16:46
par zeus
Si j'en crois la doc, les lignes sont libérées mais pas effacées.

C'est à dire qu'elle ne seront écrasées qu'à la prochaine insertion mais pas lors de l'update

Posté : 21 févr. 2006, 17:25
par BeRoots
il n'y aurai donc pas de raison d'optimiser la table :?

la doc stipule pourtant bien que optimise table compact la table si on a des lignes effacées

je pense donc que ma requete est justifier mais pourquoi je n'ai aucun message d'erreurs et aucune optimisation effectuer?

Posté : 21 févr. 2006, 17:56
par zeus
Si tu efface des tuples, la table prendra autant de place que sans effacement, mais l'optimisation permet de réutiliser la place utilisée par les lignes effacées lors des prochaines insertions. Mais en aucun cas, la table ne vas diminuer de volume lors d'une optimisation. Elle ne va que stagner lors des prochaines insertions ;)

Posté : 21 févr. 2006, 18:20
par BeRoots
donc en claire c'est inutil dans ce cas si j'ai bien compris?

Posté : 21 févr. 2006, 18:31
par zeus
C'est inutile ... tant que tu ne fait pas de INSERT sur cette table

Donc dans ton exemple, avec un DELETE et un OPTIMIZE, c'est inutile. Mais tu aurais rajouté un INSERT à la fin, ca aurait pris un sens.

Posté : 21 févr. 2006, 18:40
par BeRoots
et si je fait un INSERT depuis un autre script coté administration de mon site?

Posté : 21 févr. 2006, 20:54
par patami
en plus de l'inutilité, tu as une erreur dans ton code : regarde le nom de ta variable .. tu as deux fois $sql au lieu d'avoir pour la seconde requête $sql_2

Posté : 21 févr. 2006, 22:57
par Hubert Roksor
Désolé de te contredire zeus, mais je pense que tu fais erreur. OPTIMIZE "défragmente" les données de la table, et donc remplit les "trous". Il y a visiblement une erreur d'inattention dans la traduction française, voici la même phrase corrigée d'après la version anglaise: (modification visible en italique)
Vous pouvez vous servir de la commande OPTIMIZE TABLE pour récupérer l'espace inutilisé et défragmenter le fichier de données.
Mais comme l'a dit patami, il y a une erreur dans le code, et c'est certainement pour cela qu'il ne fonctionne pas.

Voici une version "corrigée" de ton code, BeRoots:
// on efface les lignes périmees de la table
$sql = "DELETE QUICK FROM table_manif WHERE manif_date < '$verif_date'";
mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

// on optimise la table
$sql = "OPTIMIZE TABLE table_manif";
mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
Dans cet exemple, je réutilise $sql car c'est une bonne pratique de garder le même nom pour ce genre de variables si tu n'as -bien entendu- pas besoin de récupérer la requête plus loin dans ton script, ce qui m'étonnerait. De plus, ces requêtes ne renvoient pas de résultat, donc inutile de le sauver dans $result. J'ai également remplacé $table par 'manif', car je doute que $table soit réellement dynamique, l'est-elle ?

En dernier, j'ai ajouté l'option QUICK de DELETE.
Pour les tables MyISAM, si vous spécifiez l'option QUICK, le moteur de stockage ne compacte pas les index durant l'effacement, ce qui peut accélérer certains effacements.
...çà tombe bien, OPTIMIZE les compacte et les trie juste après ;)

Posté : 21 févr. 2006, 23:18
par BeRoots
J'ai également remplacé $table par 'manif', car je doute que $table soit réellement dynamique, l'est-elle ?
ma table est une myISAM

qu'entendre par dynamique?

sinon, tout fonctionne à merveille :wink:

Posté : 21 févr. 2006, 23:35
par Hubert Roksor
Dans ton exemple, la première requête utilise "table_manif" et la seconde utilise $table donc j'en déduis que ($table == "table_manif") sinon tu aurais utilisé $table dans les deux requêtes... ou le contraire.

Posté : 21 févr. 2006, 23:58
par BeRoots
ça oui mais quel rapport avec le fait qu'elle soit réellement dynamique?

Posté : 22 févr. 2006, 00:54
par Hubert Roksor
Je parlais de $table, la variable. Si à chaque appel ($table == 'table_manif') on ne peut pas dire que la variable soit "dynamique", ou même "variable" ;)