Réglage (et compréhension) de table_cache dans mySQL

18

J'ai exécuté l'excellent script d'optimisation des performances MySQL et j'ai commencé à travailler sur les suggestions. Celui que j'ai rencontré était

TABLE CACHE
Valeur actuelle table_cache = 4096 tables Vous avez un total de 1073 tables. Vous avez 3900 tables ouvertes. Le taux de réussite actuel de table_cache est de 2%, tandis que 95% de votre cache de table est utilisé. Vous devriez probablement augmenter votre table_cache

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

Comment la mémoire utilisée par MySQL changera-t-elle si j'augmente cette variable? Qu'est-ce qu'une bonne valeur, pour la définir?

jotango
la source

Réponses:

16

De la documentation MySQL

Par exemple, pour 200 connexions simultanées en cours d'exécution, 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 des descripteurs de fichiers supplémentaires pour les tables et 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, sur la base de cette déclaration, vous devez avoir table_cache d'au moins 800.

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

ManiacZX
la source
Merci pour le pointeur. J'ai un peu peur d'augmenter mon nombre table_cache sans savoir comment l'utilisation de la RAM va changer. La RAM de la machine est déjà pleine.
jotango
Êtes-vous sûr que la mémoire est réellement utilisée ou que la mémoire a été occupée par les tampons / cache? Exécutez "free -m" et regardez la deuxième ligne (- / + buffers / cache), ceci est une représentation plus précise de votre utilisation de la mémoire en mb. Voir les réponses dans serverfault.com/questions/73189/… et serverfault.com/questions/9442/…
ManiacZX
Oui, il utilise vraiment la mémoire. Hier, il a échangé, ce qui est vraiment mauvais pour une base de données de production. J'ai commandé une mise à niveau de RAM auprès de HP aujourd'hui.
jotango
pour ceux qui viennent maintenant, cette réponse n'est pas exacte pour mysql 5.1+. il fait maintenant référence table_open_cacheà la lecture des documents. Voir la réponse de @MarkRs en regardanttable_cache
Jason
3

Vous devez surveiller la variable Opened_Tables et voir à quelle vitesse elle augmente. S'il est beaucoup plus rapide que vous créez de nouvelles tables (y compris des tables temporaires), votre cache de table est peut-être trop petit.

Table_Cache doit toujours - enfin de toute façon - être significativement plus grand que le nombre total de tables dans le serveur. Sinon, il continuera d'ouvrir et de fermer les tables.

Je ne vois pas comment vous pourriez obtenir un taux de réussite du cache de 2%, à moins que vous ne mesuriez le temps juste après un redémarrage du serveur ou que vous utilisiez beaucoup FLUSH TABLES (par rapport au nombre de requêtes). Normalement, le taux de réussite du cache de table doit être de 99,9%, sinon les performances seront nulles.

Ne faites pas de TABLES DE RINÇAGE si vous pouvez l'éviter, cela fait sauter le cache.

L'ouverture des tables coûte cher car elle doit lire le fichier FRM. Dans MyISAM, c'est nettement pire (que les autres moteurs), car lorsqu'il ferme une table, il jette également tous les blocs du cache de clés provenant de ses index. Donc, fermer une table vide ses index du cache de clés == pas bon! D'autres moteurs conservent les blocs mis en cache mais ont encore besoin de relire les métadonnées et d'allouer certaines structures.

MarkR
la source