2008-11-24 9 views
0

J'ai une base de données avec laquelle je travaille et qui est mise à jour toutes les quelques heures à distance (pas sur une période de temps spécifique) et je n'ai aucun contrôle sur l'administration de celui-ci. J'ai des clients Web qui s'y connectent pour voir les informations qu'il contient. Ces clients (codés à l'aide de PHP et Javascript) pourraient très souvent consulter la base de données (utilisateurs impatients), même si la base de données elle-même ne change pas et la vérification nécessitera une longue requête impliquant de nombreuses recherches et références croisées, etc. Donc, afin de réduire les requêtes de base de données et de garder les choses au point, quelle serait la meilleure façon de limiter le nombre de fois que les clients exécuteront la requête entière sur la base de données?Meilleure approche pour limiter le trafic de base de données sur les requêtes volumineuses?

Pour rendre les choses claires, je n'ai aucun moyen de modifier la base de données, je ne peux que l'interroger. Mais j'ai un contrôle total sur la source du client Web.

Répondre

-3

Avez-vous le contrôle de l'application Web? Si les utilisateurs sont connectés et associés à des sessions, vous pouvez mettre en cache le temps écoulé depuis la dernière interrogation de la base de données et refuser de restituer de nouvelles données si une requête est inférieure à un certain seuil depuis la dernière requête.

PHP Sessions

+0

Je devrais ajouter: Les solutions de mise en cache telles que le truppo suggèrent qu'elles peuvent également réduire les allers-retours de bases de données, et devraient être étudiées et prises en compte. – bradheintz

4

Vous devriez utiliser une sorte de cache. Pour les sites plus sérieux, jetez un oeil à memcached. Si vous travaillez à plus petite échelle, mettez en cache les résultats dans un fichier en le sérialisant.

+0

Vous pouvez également utiliser quelque chose comme APC pour mettre en cache des éléments en mémoire s'il s'agit d'un jeu de résultats assez petit. – Powerlord

2

Je prendrais un coup d'œil à Zend_Cache.

Chaque requête ne s'exécutera qu'une fois pour la durée de vie du cache (qui peut être facilement modifiée). Les sessions ne sont pas une solution viable car la même requête s'exécutera au moins une fois par utilisateur. Les sessions peuvent également être facilement renouvelées.

Vous devez vérifier si le jeu de résultats existe dans le cache. Sinon, cache le jeu de résultats avec un identifiant unique:

$query = "SELECT * FROM really_big_table"; 
$cache_query = md5($query); 
if(!$result = $cache->load($cache_query)) 
{ 
    $result = $db->fetchAll($query); 
    $cache->save($result, $cache_query); 
} 

En utilisant un cache vous configurez votre propre calendrier de mise à jour lorsque les données sont pour tous les utilisateurs.

Questions connexes