1

我在内存表中保存了一些临时数据。我只需要 20 个最近的条目,并且希望数据始终在堆上。我应该如何做到这一点?我确信我对内存表无能为力,但我应该如何处理条目表?每当我想推入一个新值时,我应该添加一个自动增加键并删除最旧的键吗?

4

2 回答 2

1

您能否更详细地描述一下您要做什么?当您可以只使用降序的 SELECT 和LIMIT 20. 如果 SELECT 查询过于昂贵,那么只需使用 memcached 或类似方法缓存结果,并在每次插入新数据时清除缓存。

如果确实需要附加表,则有几种方法可以从表中删除旧数据。您要么获取第 20 个最近数据的 id(再次降序LIMIT 19,1并删除具有较小 id 的所有内容(如果您有自动递增索引、时间戳等),或者您SELECT COUNT(*)然后DELETE使用升序和LIMIT(所有项目 - 20). 这可以打包到每几分钟运行一次的 cronjob 中。

但我真的建议使用缓存并查看表定义。有一个不错的索引应该没有任何问题。

于 2009-03-17T00:40:37.720 回答
0

附加到 20 条目表并删除最旧的元素(即具有最小 ID 的元素?)是可能的。但是,请注意,这会使表格碎片化。

只要你OPTIMIZE每隔一段时间跑一次就可以了。

另一种方法是预先分配 20 个条目并保留一个单独的计数器,其中条目是最新的。然后,您将根据计数器更新项目 ID,而不是插入/删除,然后您将递增 (mod 20 + 1) 并再次存储。

但是请注意,这两种模型都只能在“单线程”模型下工作。如果表上运行多个线程,则它们可能会发生冲突。

如果计数器在程序内存中,由线程共享但保护得当,那将是线程安全和高效的。

于 2009-02-15T20:43:26.847 回答