Question

J'ai lu à plusieurs reprises qu'après avoir supprimé une ligne d'une table InnoDB dans MySQL, son espace n'est pas réutilisé. Par conséquent, si vous faites beaucoup d'insert dans une table puis que vous supprimez périodiquement certaines lignes, la table utilisera davantage plus d'espace sur le disque, comme si les lignes n'étaient pas supprimées du tout.

Récemment, on m'a cependant dit que l'espace occupé par les lignes supprimées était réutilisé, mais seulement après que certaines transactions étaient terminées et même alors - pas complètement. Je suis maintenant confus.

Quelqu'un peut-il me donner un sens, s'il vous plaît? Je dois faire beaucoup d'insertions dans une table InnoDB, puis toutes les X minutes, je dois SUPPRIMER les enregistrements de plus de Y minutes. Ai-je un problème de table InnoDB en croissance constante ou est-ce une paranoïa?

Était-ce utile?

La solution

C’est la paranoïa:)

Les bases de données ne grossissent pas inutilement, mais pour les problèmes de performances, l'espace n'est pas libéré non plus.

Ce que vous avez probablement entendu dire, c'est que si vous supprimez des enregistrements, cet espace ne sera pas rendu au système d'exploitation . Au lieu de cela, il est gardé comme un espace vide pour que la base de données puisse être réutilisée par la suite.

C'est parce que:

  • La base de données doit disposer d’un espace disque dur pour enregistrer ses données. s'il ne dispose pas d'espace, il réserve un espace vide au début.
  • Lorsque vous insérez une nouvelle ligne, une partie de cet espace est utilisée.
  • Lorsque vous manquez d'espace libre, un nouveau bloc est réservé et ainsi de suite.
  • Maintenant, lorsque vous supprimez certaines lignes , afin d'éviter de réserver davantage de blocs, son espace est maintenu libre, mais jamais restitué au système d'exploitation. Vous pouvez donc le réutiliser ultérieurement sans tout besoin de réserver de nouveaux blocs.

Comme vous pouvez le constater, l'espace est réutilisé, mais jamais rendu. C’est l’essentiel de votre question.

Autres conseils

dans innodb, il n’existe aucun moyen pratique de libérer l’espace.

  • utiliser le fichier ibdata par table, cela vous permettent de supprimer l'enregistrement copier le données à une nouvelle table et supprimer l'ancien table, récupérant ainsi des enregistrements.
  • utilisez mysqldump et plein de recette pour nettoyer le tout serveur. Vérifiez les points suivants:
    http://dev.mysql.com/doc/ refman / 5.0 / fr / ajouter-et-enlever.html

Toutes ces méthodes deviennent impraticables lorsque vous utilisez d’énormes tables (dans mon cas, elles font plus de 250 Go) et vous devez les conserver en supprimant les enregistrements pour améliorer les performances.

Vous devrez sérieusement vous demander si vous avez assez d’espace libre sur votre disque dur pour exécuter l’une des fonctions ci-dessus (dans mon cas, je ne pense pas que 1 To soit suffisant pour toutes ces actions)

Avec la table Innotab (et mysql elle-même), les options sont assez limitées si la taille de la base de données est sérieuse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top