Mysql : après DELETE la base garde la même taille et problème d'Id

Mysql : après DELETE la base garde la même taille et problème d'Id - SQL/NoSQL - Programmation

Marsh Posté le 25-03-2005 à 10:31:17    

Bonjour, j'ai un nouveau problème (pas très grave) avec ma base Mysql (version 4.0.15).
 
J'ai plusieurs tables liées les unes aux autres, chacune ayant pour clé primaire une Id qui s'auto-incrémente. J'ai créé un outil qui permet de supprimer des lignes de données précises et qui fonctionne bien, mais après la suppression la base fait toujours la même taille! Je suis obligé (sous phpmyadmin) de faire "optimiser la table" pour que la taille soit mise à jour...
 
Ce n'est pas très gênant, mais ce qui m'embête plus c'est que la base semble garder en mémoire les Id des données que j'ai virées, ce qui donne des trucs bizarres:
J'ai une table client, avec 10 entrées (dernière Id = 10). Je supprime ces  10 entrées, j'analyse et j'optimise la table. Si j'exporte un nouveau client, il aura l'Id 11 au lieu de 1!  :heink:  
 
Quelqu'un pourrait m'expliquer pourquoi?


---------------
J'aime pas Apple...
Reply

Marsh Posté le 25-03-2005 à 10:31:17   

Reply

Marsh Posté le 25-03-2005 à 11:20:18    

1) Pour ce qui est de la taille de la base, c'est normal : Imagine que le fichier de la base de données est une miche de pain. Tes données, c'est la mie. Quand tu enlèves de la mie de pain, la miche garde sa taille, et il y a des trous dedans. D'un point de vue fonctionnement, c'est rigoureusement la même chose. C'est une façon d'optimiser la rapidité de la base.
Imagine, tu as une table avec 100 000 000 lignes. Chaque ligne fait mettons 4 Ko. Ca donne donc 400 000 000 000 octets, soit 400 Go (c'est une grosse base :D)
 
Tu supprimes une ligne à l'indice 1 (donc en début de fichier). Si MySQL "optimisait" au fur et à mesure, alors ça voudrait dire qu'il déplace 400 Go - 4 Ko dans le fichier vers le début du fichier. Je te laisse te rendre compte à quel point ce serait lent ;)
Par définition, un fichier de base de données ne peut donc que grossir.
Par contre, je te rassure, quand tu rajoutes des lignes, selon un certain nombre de critères, MySQL essaie de reboucher les trous.
 
2) Ensuite, un autoincrément "standard", se comporte comme une séquence, c'est à dire qu'il ne pourra jamais prendre une valeur qu'il a déjà affecté, même si elle n'existe plus. C'est tout à fait normal, et heureusement d'ailleurs !
Si tu veux que ton compteur reparte de la valeur X après la suppression de lignes, tu peux faire un ALTER dessus. Normalement, MySQL a aussi un mode qui bouche les trous dans un autoincrément, mais je te déconseille très fortement de l'utiliser. En effet, c'est source de problèmes dans la cohérence de ta base, et surtout, un ID n'étant pas une valeur, mais un simple compteur interne, en aucun cas tu dois te baser dessus pour de l'affichage ou autre, donc quelque soit la valeur, tu t'en moques.


Message édité par Arjuna le 25-03-2005 à 11:20:47
Reply

Marsh Posté le 25-03-2005 à 12:04:44    

Merci de ta réponse!
En fait ce qui m'étonne pour l'histoire de l'incrémentation des Id c'est que même quand je supprime tout le contenu de la base, il ne repart pas de 0 pour les nouvelles données que je mettrai. Ton explication est logique, mais je ne trouve pas ça très optimisé...


---------------
J'aime pas Apple...
Reply

Marsh Posté le 28-03-2005 à 13:19:10    

qu'il ne revienne pas à 0 c'est normal s'il s'agit d'un autoincrement. Ca fait parti de sa definition, le numero unique.  
 
Pour la taille, c'est normal qu'elle ne soit pas recuperée immediatement. Ca deviendrait trop consommateur d'optimiser la structure en continu.


---------------
MZP est de retour
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed