数据库变更检测

时间:2011-08-22 14:04:04

标签: php mysql database

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

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

我将大小相加并得到一个“唯一”数字。将它与前一个进行比较,如果值相同,则传递缓存页面,如果没有,则运行“普通”页面,然后缓存它。

所以我认为理论上这可以工作,因为我只有1个数据库查询,并且基于该查询将网站(根据结果缓存或未缓存)传递给用户。

这可行,如果没有 - 为什么?

编辑:

为最后一次更新时间戳的查询怎么样? LINK

5 个答案:

答案 0 :(得分:1)

谁在更新数据库?建议导致更改的进程应该是使缓存失效的进程。当用户/管理员对表格进行更改时,您可以:

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

建议大小不是'发生变化'的良好指标。忘记行 - 如果bool / bit值改变怎么办?这满足了使缓存无效的条件,但'size'总是相同的。您可以使用last-change-datetime来改进这一点,但是您仍然遇到相同的基本问题 - 查询数据库以检查更改标志。有点破坏了缓存的目的。

考虑另一种方法 - 每 n 分钟重新加载缓存。无论是否有变化,只需重新加载即可。 n 将是符合您业务要求的值。您可以拥有陈旧缓存,并且最多可以提供 n 分钟的旧/陈旧数据。这不是我的建议,而是值得考虑的事情。

答案 1 :(得分:0)

有趣的方法。

根据http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html,您可能会获得Data_length值的近似值 - 并且在示例链接中,存在可疑的圆形数字。我肯定会再尝试一些,以确保它能按照你的想法做到。

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

我还会在一个非平凡的系统上测试“有任何改变”查询的性能。我猜这是准确的,数据库服务器需要查看文件系统,我猜测它比通过SQL查询它慢很多倍。

其次 - 根据底层应用程序 - 您可能会经常发现应用程序数据发生变化,以至于您不断地使缓存失效。

答案 2 :(得分: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 />
';
}

?> 

答案 3 :(得分:0)

您可以CREATE TRIGGER更新,插入,删除和替换要监视的表,将CURRENT_TIMESTAMP()插入到单独表中的某种状态字段中。在每个页面的顶部读取此值并将其与缓存的时间戳进行比较,如果它比缓存旧,则使用缓存。

答案 4 :(得分:0)

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

尝试了这个,它就像一个魅力......