2011-08-22 8 views
1

J'ai besoin d'un moyen de détecter les changements de ma base de données car j'implémente un système de mise en cache sur le site d'un client. (en cache toute la page, pas seulement les requêtes)Détection de changement de base de données

En haut de chaque page (j'ai une "page maître" donc juste une place dans le code), j'interroge la base de données pour voir si c'est size is changed like so. Je somme la taille et j'obtiens un nombre "unique". Comparez-le à la précédente, et si les valeurs sont les mêmes, fournissez la page mise en cache, sinon, lancez la page "normale" et mettez-la en cache. Donc, en théorie, cela pourrait fonctionner, parce que je n'ai qu'une seule requête de base de données, et sur la base de cela livrer le site (mis en cache ou non en fonction du résultat) à l'utilisateur.

Est-ce que cela pourrait fonctionner, et sinon? Pourquoi?

EDIT:

Qu'en est-cheking pour la dernière mise à jour de l'horodatage? LINK

+0

S'il vous plaît expliquer ce que vous entendez par « taille ». Que faire si une ligne a été supprimée et qu'une nouvelle ligne a été ajoutée? Le but de la mise en cache est d'éviter tout travail de base de données. – Oded

+0

oui, je sais, mais je pensais que si je pouvais réduire à une seule requête, le chargement serait plus rapide ... – Andrej

+0

Vous pouvez charger _all_ des données dont vous avez besoin pour la page en une seule requête. – Oded

Répondre

1

Qui met à jour la base de données? Suggérer que le processus provoquant la modification devrait être celui qui invalide votre cache. Lorsqu'un utilisateur/admin provoque un changement de se produire à la table, vous pouvez:

  • si l'administrateur et le site destiné au public partagent le même espace d'application (à savoir qu'ils sont de la même application), puis simplement mettre à jour le cache au moment où l'administrateur fait un changement.
  • définir un bit d'état quelque part (variable de session peut-être), et vérifier périodiquement pour recharger vos données en cache.

La taille suggérée n'est pas un bon indicateur du 'changement survenu'. Forget rows - que se passe-t-il si une valeur bool/bit change? Cela satisferait à la condition d'invalider le cache, mais la 'taille' serait toujours la même. Vous pouvez améliorer cela avec un last-change-datetime, mais vous rencontrez toujours le même problème de base: interroger la base de données pour rechercher un indicateur de modification. Type de défaites le but d'un cache.

Envisagez une autre approche - rechargez votre cache tous les n minutes. Qu'il y ait eu un changement ou non, il suffit de le recharger. n sera une valeur qui correspond à vos besoins d'affaires.Vous pouvez avoir un cache obsolète et servir des données anciennes/périmées pendant au plus n minutes. Ce ne serait pas mes suggestions, mais quelque chose à considérer.

0

Approche intéressante.

Selon http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html, vous pouvez obtenir des valeurs approximatives pour les valeurs Data_length - et dans l'exemple de lien, il y avait des nombres rondement suspects. J'essaierais certainement d'en faire d'autres pour m'assurer qu'il fait ce que vous pensez qu'il fait.

Vous devez également vous assurer que cela fonctionne pour les mises à jour, pas seulement les suppressions/insertions.

Je testerais également les performances de la requête "has anything changed" sur un système non trivial. Je suppose que pour que cela soit précis, le serveur DB devrait examiner le système de fichiers, ce que je suppose être beaucoup plus lent que de l'interroger via SQL. Deuxièmement, en fonction de l'application sous-jacente, vous risquez de voir vos données d'application changer si souvent que vous annulez constamment le cache.

0

Vous pouvez utiliser ceci:

<?php 

mysql_connect("localhost","root",""); 
$result = mysql_query("SHOW TABLE STATUS FROM test;"); 
while($array = mysql_fetch_array($result)) { 
$total = $array[Data_length]+$array[Index_length]; 
echo ' 
Table: '.$array[Name].'<br /> 
Data Size: '.$array[Data_length].'<br /> 
Index Size: '.$array[Index_length].'<br /> 
Total Size: '.$total.'<br /> 
Total Rows: '.$array[Rows].'<br /> 
Average Size Per Row: '.$array[Avg_row_length].'<br /><br /> 
'; 
} 

?> 
0

Vous pouvez CREATE TRIGGER s AFTER UPDATE, INSERT, DELETE et REPLACE sur la table que vous souhaitez surveiller cet insert CURRENT_TIMESTAMP() dans une sorte de champ d'état dans un document distinct table. En haut de chaque page, lisez cette valeur et comparez-la avec l'horodatage de votre cache, s'il est plus ancien que votre cache, utilisez le cache.

0
SELECT max(UPDATE_TIME) 
FROM information_schema.tables 
WHERE TABLE_TYPE = 'BASE TABLE' 
AND TABLE_SCHEMA = 'DB_NAME_GOES_HERE' 

tryed cela, et il fonctionne comme un charme ....

Questions connexes