3 votes

Accorder le cache de requêtes de mysql

Je suis en train d'étudier l'optimisation du cache de requêtes sur mysql sur mon VPS [une configuration de 360Mo]. Au début, il était réglé à 32Mo, et je recevais un nombre non négligeable de qcache_lowmem_prunes. J'ai ajouté une tâche cron pour exécuter FLUSH QUERY CACHE périodiquement, ce qui a aidé, mais pas assez. J'ai progressivement augmenté sa taille, mais même à 80Mo [j'ai temporairement retiré de la mémoire à php-cgi], je vois toujours des purges de mémoire basse.

D'autre part, je n'ai qu'un taux de réussite d'environ 50% [c'est-à-dire, Qcache_hits est environ la moitié de Qcache_hits+Com_select]. Je soupçonne fortement que bon nombre de mes requêtes sont des requêtes ponctuelles, et ne devraient donc pas être mises en cache. J'aimerais les identifier et les marquer avec SQL_NO_CACHE.

Des suggestions pour une manière facile de le faire ?

Il est également possible que certaines de mes requêtes ne soient pas mises en cache car les tables ont changé, bien que je ne pense pas, en me basant sur un modèle mental approximatif, que ce soit le cas. Au moins, les résultats devraient être cohérents pour la plupart des requêtes; J'utilise InnoDB, donc de ce que je comprends, une mise à jour aléatoire ne invalide pas forcément toutes les sélections. Est-ce correct ?

1voto

Jon Haddad Points 1332

Je ne comprends pas pourquoi vous voulez vider le cache. Il se gère tout seul, et il n'y a aucun avantage en termes de performance (que j'ai pu remarquer) à le vider périodiquement. Un taux de réussite du cache de 50% est en fait assez incroyable.

Toute mise à jour d'une ligne dans la table invalide toutes les requêtes qui ont utilisé cette table. Cela signifie que toutes les requêtes qui y font une jointure sont purgées. Peu importe si les résultats sont affectés ou non.

Je vous suggère d'utiliser une solution de mise en cache comme memcached à la place, où vous avez un contrôle plus fin sur ce qui est mis en cache et sur la durée de vie des données.

Si vous rencontrez des problèmes de performances, il serait peut-être préférable de supprimer la mémoire associée au cache des requêtes et d'augmenter la taille de votre innodb_buffer_pool et de votre innodb_additional_mem_pool_size.

http://dev.mysql.com/doc/refman/5.0/fr/innodb-configuration.html

De plus, vous devriez jeter un œil à l'outil mysql tuner : https://launchpad.net/mysqltuner/

0voto

Deimosfr Points 594

Vous pouvez créer un déclencheur MySQL pour analyser en temps réel les requêtes entrantes et les réécrire avec la variable query_cache.

Cela consommera plus de CPU, mais évitera de regarder le code source du logiciel.

http://dev.mysql.com/doc/refman/5.0/fr/create-trigger.html

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X