2011-08-22 132 views
1

我需要一种方法来检测我的数据库的更改,因为我正在客户端的站点上实现缓存系统。 (缓存整个页面,而不仅仅是查询)数据库更改检测

在每页的顶部(我有一个“母版页”,所以只有一个地方在代码中)我查询数据库,看看它是否size is changed like so

我总结大小,并得到一个“唯一”的数字。将它与前一个比较,如果值相同,则传递缓存页面,如果不存在,则运行“正常”页面,然后缓存该页面。

所以我认为在理论上这可以工作,因为我只有1个数据库查询,并基于该网站向用户提供网站(缓存或未缓存取决于结果)。

可以这项工作,如果没有 - 为什么?

编辑:

怎么样cheking最后更新时间戳? LINK

+0

请解释一下你的“大小”的意思。如果一行被删除并添加了一个新行?缓存的重点是避免_any_数据库的工作。 – Oded

+0

是的,我知道,但我想如果我可以缩小到只有一个查询,加载会更快...... – Andrej

+0

您可以在一个查询中加载所需的页面数据_all_。 – Oded

回答

1

谁在更新数据库?建议导致更改的进程应该是使缓存无效的那个进程。当用户/管理员引起的变化发生的表,你可以:

  • 如果管理员和面向公众的网站使用相同的应用空间(即它们是相同的应用程序),然后简单地更新在管理员进行更改时缓存。
  • 在某处设置状态位(可能是会话变量),并定期检查以重新加载缓存的数据。

建议大小不是一个'发生变化'的好指标。忘记行 - 如果布尔值/位值更改会怎样?这将满足使缓存无效的条件,但'大小'将始终是相同的。你可以用最后更改的日期时间来改进,但你仍然有相同的基本问题 - 查询数据库以检查更改标志。有点失败了缓存的目的。

考虑另一种方法 - 每隔n分钟重新加载缓存。无论是否有变化,只需重新加载即可。 n将是一个符合您业务需求的值。你可能会有陈旧的缓存,并提供最多n分钟的旧/过时数据。这不是我的建议,但需要考虑。

0

有趣的方法。

根据http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html,您可能会得到Data_length值的近似值 - 并且在示例链接中存在可疑的整数。我肯定会试验一下,以确保它能够做到你认为它所做的一切。

您还应该确保这适用于更新,而不仅仅是删除/插入。

我还会测试非平凡系统上“有任何改变”查询的性能。我猜测,为了准确,数据库服务器需要查看文件系统,我猜测它比通过SQL查询文件系统要慢很多倍。其次 - 根据底层应用程序的不同,您可能会发现应用程序数据变化频繁,以至于您经常使缓存无效。

0

您可以使用此:

<?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

可以更新CREATE TRIGGER年代后,INSERT,DELETE和REPLACE在桌子上,你想监控插入CURRENT_TIMESTAMP()进入某种状态字段的在一个单独的表。在每个页面的顶部读取该值,并将其与缓存的时间戳进行比较,如果它比缓存旧,则使用缓存。

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

tryed这一点,它的工作原理就像一个魅力....