我在内存表中保存了一些临时数据。我只需要 20 个最近的条目,并且希望数据始终在堆上。我应该如何做到这一点?我确信我对内存表无能为力,但我应该如何处理条目表?每当我想推入一个新值时,我应该添加一个自动增加键并删除最旧的键吗?
2 回答
您能否更详细地描述一下您要做什么?当您可以只使用降序的 SELECT 和LIMIT 20
. 如果 SELECT 查询过于昂贵,那么只需使用 memcached 或类似方法缓存结果,并在每次插入新数据时清除缓存。
如果确实需要附加表,则有几种方法可以从表中删除旧数据。您要么获取第 20 个最近数据的 id(再次降序LIMIT 19,1
并删除具有较小 id 的所有内容(如果您有自动递增索引、时间戳等),或者您SELECT COUNT(*)
然后DELETE
使用升序和LIMIT
(所有项目 - 20). 这可以打包到每几分钟运行一次的 cronjob 中。
但我真的建议使用缓存并查看表定义。有一个不错的索引应该没有任何问题。
附加到 20 条目表并删除最旧的元素(即具有最小 ID 的元素?)是可能的。但是,请注意,这会使表格碎片化。
只要你OPTIMIZE
每隔一段时间跑一次就可以了。
另一种方法是预先分配 20 个条目并保留一个单独的计数器,其中条目是最新的。然后,您将根据计数器更新项目 ID,而不是插入/删除,然后您将递增 (mod 20 + 1) 并再次存储。
但是请注意,这两种模型都只能在“单线程”模型下工作。如果表上运行多个线程,则它们可能会发生冲突。
如果计数器在程序内存中,由线程共享但保护得当,那将是线程安全和高效的。