2011-08-10 2 views
1

Il y a quelque temps, nous avions écrit un site Web interne qui fournissait des mises à jour constantes de tous les utilisateurs qui s'inscrivaient sur notre site Web. Le site Web fourni des informations sur les utilisateurs enregistrés dans les 5 dernières minutes qui nécessitaient des extractions SQL (select * from users...) pour obtenir TOUS les utilisateurs where (Current time - Registered time) <= 300 seconds. Les heures supplémentaires, les requêtes SQL constantes sont devenues un goulot d'étranglement (nous ne savions pas que cela n'arriverait pas, mais nous avions besoin du site interne à l'époque car le public cible était très petit et c'était une solution rapide).Recommandation (s) pour améliorer la performance du site Web - PHP/MySQL

Quelqu'un peut-il me fournir des suggestions sur la façon dont je peux éliminer les fetchs SQL périodiques avec une autre solution qui peut améliorer les performances du site?

+0

Utilisez une forme de mise en cache. J'utiliserais [redis] (http://www.redis.io). Cela a un php module php. Ajouter le dernier utilisateur au cache et cela enlèvera une partie de la charge. –

+0

S'il vous plaît montrer une requête exacte que vous exécutez. – sanmai

Répondre

3

La mise en mémoire cache est une option normalement considérée ici. Beaucoup ont opté pour membase (une extension de memcached), un cache de valeur-clé en mémoire avec la possibilité de persister sur le disque et de bien évoluer. Une bibliothèque de client PHP est disponible à Couchbase's website, et vous trouverez que les éléments de mise en cache transforment les requêtes 1s + en sous-millisecondes. L'API est également très simple:

$mc = new Memcached; 
    $mc->addServer("localhost", 11211); 
    $mc->set("a", 1); // set a 1 to the key 'a' 
    $mc->get("a"); // retrieve value at key 'a' 
3

Peut-être que vous pourriez utiliser la mise en cache ici. Cache chaque nouvel utilisateur lors de son inscription; De cette façon, ils sont en mémoire.

Mettre en cache tous ceux qui s'inscrivent et INSERT dans la base de données après qu'un certain nombre a été mis en file d'attente OU qu'une période de temps fixe a été atteinte.

2

Pour résoudre ce problème spécifique, la mise en cache du résultat est probablement la meilleure solution. Il n'a besoin que d'être mis en cache pendant quelques secondes - la plupart des gens ne remarqueraient pas si les données sont en retard de plus de 10 secondes. En fonction de l'application, vous pouvez vous en sortir avec jusqu'à 10 minutes de retard.

L'autre moitié de la mise en cache d'une requête coûteuse est que vous devez ajouter un indicateur à vos données mises en cache pour indiquer quand il est mis à jour. Cela arrête plusieurs threads en décidant qu'il est obsolète et qu'ils récupèrent tous une mise à jour. Vous avez seulement besoin d'un fil pour le faire!

Questions connexes