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