2010-06-09 9 views
1

J'ai une table de plus de 150.000 lignes dont la plupart seraient mises à jour quotidiennement. J'ai la mise en cache mysql activée afin que les pages se chargent plus rapidement mais chaque fois que la base de données est mise à jour, les pages se rechargent lentement, ce qui suppose que le cache se reconstruit à nouveau.Comment construire manuellement cache mysql

Donc, en ce moment, j'ai eu recours à un wget -m --delete-after http://localhost/ sur le serveur, mais cela prend environ 4 heures pour terminer et se déplace quelque chose comme 13 gig.

Y a-t-il une meilleure façon de procéder?

Répondre

4

Le cache MySQL fonctionne différemment selon que vous utilisez le moteur de stockage MyISAM ou le moteur de stockage InnoDB. MyISAM ne met en cache que les index, pas les données. Vous pouvez utiliser LOAD INDEX INTO CACHE pour précharger les index MyISAM dans le cache du tampon de clé. Mais il n'y a pas de déclaration équivalente si vous utilisez InnoDB.

InnoDB met en cache les pages de données et d'index. Il n'y a pas de commande spécialisée pour réchauffer les tampons de cache, mais vous pouvez exécuter quelques instructions SQL qui effectuent des analyses de table complètes et des index-scans complets pour les charger dans les tampons. Vous devriez être capable de le faire en utilisant un script sur le serveur, sans avoir recours à wget!

Je suis d'accord avec la réponse de @code_burgar: 150k lignes sont assez petites pour que vous ne deviez pas remarquer beaucoup de pénalités de performance pendant que le cache se réchauffe.

Si vous parlez de réchauffer le Query Cache, c'est un problème différent. Vous devrez réchauffer le cache de requêtes à l'aide de requêtes SQL spécifiques, car ce cache conserve textuellement les ensembles de résultats associés à ces requêtes SQL. Votre solution wget est inefficace et duplique probablement beaucoup de travail. Vous devriez être en mesure d'amorcer le cache de requêtes en exécutant un script sur le serveur qui exécute chaque requête que vous souhaitez mettre en cache une fois.

Mais vous devrez peut-être effectuer une révision de code pour déterminer quelles sont ces requêtes et mettre à jour périodiquement votre script de préchargement du cache si votre code change.

+0

Merci beaucoup c'est MyISAM donc je vais essayer la commande LOAD INDEX IN CACHE dans la matinée et voir si ça fait l'affaire. Pour le cache de requête serait-il aussi simple que de sélectionner tout de chaque table? – hamstar

+1

Le cache de requêtes met en cache les ensembles de résultats pour des requêtes spécifiques. Il ne serait donc pas utile de tout sélectionner dans chaque tableau (sauf si ce sont les requêtes que vous utilisez dans votre application, ce dont je doute). –

+0

Ça l'a fait, c'est rapide comme maintenant :) MERCI! – hamstar

1

150 000 lignes sont vraiment petites en termes de taille de table.

Votre table est-elle correctement indexée?

Comment procédez-vous à la mise à jour, planifiez-vous et/ou limitez-vous les mises à jour ou laissez-les aller tout à la fois?

Le ralentissement survient probablement parce que vous essayez de mettre à jour trop de lignes à la fois sans laisser le serveur respirer. Essayez de limiter les mises à jour.

+0

Je crois qu'il est correctement indexé, je n'ai pas créé la base de données, mais les gars qui l'ont fait étaient assez sur je pense. La mise à jour est tout fait à la fois dans une base de données non vivante, prend 1.5 heures (spidering). Ensuite, les tables sont copiées sur le live db, prend environ 3 secondes. Après que les pages sur le site se chargent lentement. – hamstar