Le cache des tables ouvertes peut grossir jusqu'au maximum de table_cache
(par défaut 64; mais cela peut être changé avec l'option -O table_cache=#
de mysqld
). Une table n'est jamais fermé, sauf si le cache est plein, et qu'un thread essaie d'ouvrir une autre table, ou si vous utilisez mysqladmin refresh
ou mysqladmin flush-tables
.
Lorsque le cache de table ouverte se remplit, le serveur utilise les règles suivantes pour localiser la prochaine entrée à utiliser :
- Les tables qui ne sont pas utilisées sont fermées : MySQL prendra alors en priorité la table qui a été utilisée pour la dernière fois il y a le plus longtemps.
- Si le cache se remplit et qu'aucune table ne peut être fermée, mais qu'une nouvelle table doit être ouverte, le cache est temporairement agrandi en fonction des besoins.
- Si le cache est déjà dans un état étendu, et qu'une table passe de l'état d'utilisation à l'état de non utilisation (tout en restant ouverte), elle est automatiquement fermée, et retirée du cache.
Une table est ouverte à chaque accès concurrent. Cela signifie que si vous avez deux threads qui accèdent en même temps à une table, ou accèdent deux fois à une table dans la même requête ( avec AS
), la table sera ouverte deux fois. La première ouverture d'une table requière deux pointeurs de fichiers, et chaque accès supplémentaire n'en demande qu'un de plus. Le deuxième pointeur de fichier ouvert lors de la première ouverture est pour le fichier d'index, et de pointeur est partagé entre tous les autres threads.
Si vous avez trop de fichier dans un dossier, ouvrir, fermer et évaluer des opérations se fera lentement. Si vous exécutez une commande SELECT
sur de nombreuses tables, il ne restera plus beaucoup de marge de man§uvre lorsque le cache sera plein, et cela ralentira nettement les exécutions, puisque pour chaque table à ouvrir, il faut qu'une autre se libère. Vous pouvez réduire ces latences en augmentant la taille du cache.