requete pour optimiser une table

Mammouth du PHP | 843 Messages

21 févr. 2006, 15:19

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());
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 févr. 2006, 15:53

Qu'est-ce que tu vérifies pour voir l'optimisation ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 843 Messages

21 févr. 2006, 16:17

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
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 févr. 2006, 16:46

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 843 Messages

21 févr. 2006, 17:25

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?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 févr. 2006, 17:56

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 843 Messages

21 févr. 2006, 18:20

donc en claire c'est inutil dans ce cas si j'ai bien compris?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 févr. 2006, 18:31

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 843 Messages

21 févr. 2006, 18:40

et si je fait un INSERT depuis un autre script coté administration de mon site?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Eléphant du PHP | 52 Messages

21 févr. 2006, 20:54

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

21 févr. 2006, 22:57

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 ;)

Mammouth du PHP | 843 Messages

21 févr. 2006, 23:18

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:
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

21 févr. 2006, 23:35

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.

Mammouth du PHP | 843 Messages

21 févr. 2006, 23:58

ça oui mais quel rapport avec le fait qu'elle soit réellement dynamique?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 févr. 2006, 00:54

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" ;)