web-dev-qa-db-fra.com

Tuning (et compréhension) table_cache dans mysql

J'ai couru l'excellent script de syntonisation de performance MySQL et j'ai commencé à travailler à travers les suggestions. Celui que j'ai couru était

Cache de table
Valeur actuelle Table_Cache = 4096 Tables Vous avez un total de 1073 tables. Vous avez 3900 tables ouvertes. Le taux de frappe Table_Cache actuel est de 2%, tandis que 95% de votre cache de table est en cours d'utilisation. Vous devriez probablement augmenter votre table_cache

J'ai commencé à lire sur la table_cache mais j'ai trouvé la documentation MySQL Manque assez. Ils disent d'augmenter le table_cache, "si vous avez la mémoire". Malheureusement, le table_cache la variable est définie comme "le nombre de tables ouvertes pour tous les threads".

Comment la mémoire sera-t-elle utilisée par MySQL changer, si j'augmente cette variable? Quelle est une bonne valeur, pour la définir?

18
jotango

De la documentation MySQL

Par exemple, pour 200 connexions d'exécution simultanées, vous devez avoir une taille de cache de table d'au moins 200 × N, où N est le nombre maximal de tables par jointure dans l'une des requêtes que vous exécutez. Vous devez également réserver certains descripteurs de fichier supplémentaires pour les tables et les fichiers temporaires.

Donc, si dans votre application, vous avez une requête qui joint 4 tables et que vous souhaitez pouvoir gérer 200 connexions simultanées, en fonction de cette instruction, vous devez avoir une table_cache d'au moins 800.

En ce qui concerne l'utilisation de la mémoire, je n'ai pas ces chiffres, je soupçonnerais que cela dépendra de la taille de vos tables en cache.

16
ManiacZX

Vous devez surveiller la variable ouverted_tables et voir à quelle vitesse elle augmente. S'il est significativement plus rapide que vous ne créez de nouvelles tables (y compris les celles temporaires), votre cache de table peut être trop petite.

TABLE_CACHACHE doit toujours - bien de toute façon - être significativement plus gros que le nombre total de tables sur le serveur. Sinon, il va continuer à ouvrir et à fermer des tables.

Je ne vois pas comment obtenir un taux de frappe de cache de 2%, sauf si vous ne mesuriez pas le temps après un redémarrage du serveur ou à l'aide de tables de rinçage, beaucoup (par rapport au nombre de requêtes). Normalement, le taux de frappe de cache de table doit être de 99,9% sinon la performance sera suce.

Ne faites pas de tables encastrées si vous pouvez l'éviter, il souffle la cache.

Les tables d'ouverture sont chères car elles doivent lire le fichier FRM. Dans Myisam, il est nettement pire (que d'autres moteurs), comme lorsqu'il ferme une table, il jette également tous les blocs du cache de clé provenant de ses index. Ainsi, fermez une table décharge ses index du cache de clé == Pas bon! D'autres moteurs conservent les blocs en cache mais doivent encore relire des métadonnées et allouer certaines structures.

3
MarkR