2016-02-02 1 views
0

Pourriez-vous me dire si les données MySQL dans les tables seront physiquement fragmentées si j'insère de nouvelles données et efface les anciennes données (insérer dans le tableau, et supprimer les lignes du bas)?Fragmentation physique des données de la table MySQL

La taille de la table augmentera-t-elle de quelque façon que ce soit avant que je ne OPTIMISE?

Répondre

1

Êtes-vous DELETEing et INSERTing à peu près au même rythme? Est-ce que la table InnoDB?

Si oui aux deux, alors "ne vous inquiétez pas". Le DELETEs libèrera des blocs et le INSERTs réutilisera ces blocs (ou de nouveaux blocs si les INSERTs avancent).

Les tables InnoDB sont composées de blocs de 16 Ko enchaînés dans une structure BTree. Ce que vous avez décrit libère des blocs d'un côté de l'arbre et crée de nouveaux blocs de l'autre côté. Cependant, chaque bloc peut résider n'importe où, donc le concept de «côté de l'arbre» ​​est plus «virtuel» que «physique». Après avoir fait beaucoup de barattage, essayez le OPTIMIZEune fois. Si cela ne réduit pas la taille de la table de moitié, c'est un indice supplémentaire que OPTIMIZE ne vaut pas le coup. Un rétrécissement de 30% après beaucoup de baratte est quelque peu typique. Mais il se stabilise à peu près à cela et ne dépassera pas les 30%.

Si, d'autre part, vous êtes DELETEingplus de la table à la fois, alors vous pouvez être mieux reconstruire la table avec les lignes non-à-être-supprimé. Cela combine les étapes de suppression et d'optimisation en une seule. Ensuite, utiliser pour retourner les tables « instantanément »:

RENAME TABLE real TO old, new TO real; DROP TABLE old; 

Et faire pas faire des inserts pendant la reconstruction.

0

Lorsque innodb_file_per_table est désactivé et que toutes les données sont stockées dans des fichiers ibdata. Lorsque vous supprimez des lignes, elles sont simplement marquées comme effacées sur le disque mais l'espace sera consommé par les fichiers InnoDB qui pourront être réutilisés plus tard lorsque vous insérerez/mettrez à jour plus de lignes mais il ne rétrécira jamais. Si vous supprimez certaines tables de suppression de certaines données, il n'y a pas d'autre moyen de récupérer cet espace disque inutilisé à l'exception de la méthode dump/reload. Mais si vous utilisez innodb_file_per_table, vous pouvez récupérer l'espace en exécutant OPTIMIZE TABLE sur cette table. OPTIMIZE TABLE créera une nouvelle table vide identique. Ensuite, il copiera les données ligne par ligne de l'ancienne table vers la nouvelle. Dans ce processus, un nouvel espace de table .ibd sera créé et l'espace sera récupéré. Cependant, l'espace de table partagé-ibdata1 peut encore augmenter.

Pour plus d'info- mysql reference et percona expert