2010-05-28 4 views
2

Lorsque vous exécutez une suppression sur une table MyISAM, elle laisse un trou dans la table jusqu'à ce que la table soit optimisée.Est-ce que les trous MyISAM sont automatiquement remplis?

Ceci affecte les insertions concurrentes. Avec le paramètre par défaut, concurrent_inserts ne fonctionne que pour les tables sans trous. Toutefois, dans la documentation de MyISAM, sous la section concurrent_insert, il est indiqué:

Active les insertions simultanées pour toutes les tables MyISAM, même celles qui ont des trous. Pour une table avec un trou, de nouvelles lignes sont insérées à la fin de la table si elle est utilisée par un autre thread. Sinon, MySQL acquiert un verrou d'écriture normal et insère la ligne dans le trou.

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_concurrent_insert

Est-ce que cela signifie MyISAM remplit automatiquement dans les trous à chaque fois qu'une nouvelle ligne est d'insérer dans la table? Auparavant, je pensais que les trous ne seraient pas corrigés avant d'avoir OPTIMISÉ une table.

Répondre

1

Oui, les tables MyISAM réutilisent l'espace supprimé/libre (que ce soit vrai pour tous les cas, je ne sais pas). Cela peut facilement être observé en supprimant une poignée d'enregistrements et en en insérant un nouveau - le fichier de données MyISAM pour cette table ne grossira pas.

1

Les inserts au milieu de la table nécessitent un verrou. Donc, dans le réglage par défaut, MySQL favorisera le remplissage des trous, même si cela empêchera les insertions simultanées.

Donc, oui, MySQL préfère remplir les trous. Définir concurr_inserts à 2 indique à MySQL que s'il y a un verrou sur la table, insérez à la fin, qui ne nécessite pas de verrou, même s'il reste des trous à remplir. Par conséquent, cela permet des insertions simultanées même s'il y a des trous au milieu, au prix de prendre plus de temps pour remplir les trous.

Questions connexes