2012-03-03 3 views
0

J'ai environ 10 tables avec ~ 10 000 lignes chacune qui doivent être tirées très souvent.Tirer un très grand nombre de rangées très souvent - ai-je besoin de memcached ici?

Par exemple, la liste des pays, la liste de toutes les écoles du monde, etc.

PHP ne peut pas persister ce genre de choses dans la mémoire (à ma connaissance) donc je dois interroger le serveur pour un SELECT * DE TABLE à chaque fois. Devrais-je utiliser memcached ici? Au début, c'est un oui absolu, mais à la réflexion, mysql ne serait-il pas déjà en cache pour moi et ce serait presque redondant?

Je n'ai pas trop de compréhension de la façon dont mysql met en cache les données (ou s'il cache des tables entières).

Répondre

2

Vous pouvez utiliser le cache de requêtes MySQL, mais vous utilisez toujours les ressources DB pour établir la connexion et exécuter la requête. Une autre option est opcode caching si vos pages sont relativement statiques. Cependant, je pense que memcached est la solution la plus flexible. Par exemple, si vous avez une liste de pays qui doivent être accessibles à partir de divers points de code dans votre application, vous pouvez extraire les données du magasin persistant (mysql) et les stocker dans memcached. Ensuite, les données sont disponibles pour toute partie de votre application (y compris les traitements par lots et cronjobs) pour toutes les exigences de l'entreprise.

0

Vous avez besoin une sorte de cache ici, certainement; les couches de mise en cache dans et autour de la base de données sont considérablement moins efficaces que ce que memcached peut fournir. Cela dit, si vous concluez que la bonne chose est de mettre en cache la requête elle-même, plutôt que de mettre en cache le contenu que vous générez en fonction de la requête, je pense que vous êtes en train de tirer des conclusions - - plus d'analyse est nécessaire.

Quelles données, autres que le contenu de ces requêtes, sont utilisées pendant la génération de sortie? Est-ce qu'un cache de page ou un cache de fragment de page (ou un reverse-proxy de cache en face) aurait plus de sens? Est-il vraiment nécessaire d'exécuter ces requêtes "souvent"? À quelle fréquence les données sous-jacentes changent-elles? Avez-vous une sorte d'événement de notification lorsque cela se produit? En outre, les requêtes SELECT * sans clause sont une "odeur de code" (indiquant que quelque chose est probablement fait de manière erronée), en particulier si toutes les données extraites ne sont pas directement affichées à l'utilisateur.

Questions connexes