mysql,强制限制表中的条目

mysql,强制限制表中的条目,mysql,memory-table,Mysql,Memory Table,我在内存表中保留了一些临时数据。我只需要最新的20个条目,希望数据总是在堆上。我应该如何做到这一点?我确信对于内存表我无能为力,但是我应该如何处理表中的条目呢?我是否应该添加一个自动递增键,并在我想要在中推送一个新值时删除最旧的元素?附加到20条目表并删除最旧的元素(即具有最小ID的元素?)是可能的。但是,请注意,这将对表进行分段 只要您每隔一段时间运行一次OPTIMIZE,就可以了 另一种方法是预先分配20个条目,并保留一个单独的计数器,其中条目是最新的。然后,不用插入/删除,而是根据计数器更

我在内存表中保留了一些临时数据。我只需要最新的20个条目,希望数据总是在堆上。我应该如何做到这一点?我确信对于内存表我无能为力,但是我应该如何处理表中的条目呢?我是否应该添加一个自动递增键,并在我想要在中推送一个新值时删除最旧的元素?

附加到20条目表并删除最旧的元素(即具有最小ID的元素?)是可能的。但是,请注意,这将对表进行分段

只要您每隔一段时间运行一次
OPTIMIZE
,就可以了

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

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


如果计数器位于程序内存中,由线程共享,但受到适当保护,则这将是线程安全和高效的。

可以附加到20个条目表并删除最旧的元素(即具有最小ID的元素?)。但是,请注意,这将对表进行分段

只要您每隔一段时间运行一次
OPTIMIZE
,就可以了

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

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


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

您能更详细地描述一下您正在尝试做什么吗?我不明白,当您可以使用降序选择和
限制20
时,为什么要将最新数据保留在附加表中。如果SELECT查询过于昂贵,则只需使用memcached或类似工具缓存结果,并在每次插入新数据时清除缓存

如果确实需要额外的表,有几种方法可以从表中删除旧数据。您可以获取第20个最新数据的id(同样是降序和
限制19,1
并删除所有id较小的数据(如果您有自动递增索引、时间戳等),或者
选择COUNT(*)
,然后按升序和
限制执行
删除
(所有项目-20)。这可以打包到每隔几分钟运行一次的cronjob中


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

您能更详细地描述一下,您想做什么吗?我不明白,当您可以使用降序选择和时,为什么要将最新的数据保存在一个附加表中ode>LIMIT 20
。如果SELECT查询太昂贵,则只需使用memcached或类似工具缓存结果,并在每次插入新数据时清除缓存

如果确实需要额外的表,有几种方法可以从表中删除旧数据。要么获取第20个最新数据的id(同样是降序和
LIMIT 19,1
并删除所有id较小的数据(如果有自动递增索引、时间戳等),要么
选择COUNT(*)
,然后按升序执行
删除
,并执行
限制(所有项目-20)。这可以打包到每隔几分钟运行一次的cronjob中


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

如何保护mysql表?mysql不是为您这样做的吗?关于Fragementation stat,您是否建议使用一个表,其中包含一列,其中包含一行,这是要写入的索引EMT:面对最多20行,这难道不是无关紧要的吗?@acid:MySQL可以确保数据完整性,但您需要执行两个操作:插入和删除。如何决定删除哪一个?选择表的最小ID并删除?如果两个线程同时执行该操作,会怎么样?它们将选择同一行。MySQL无法阻止这一操作。@to马拉克:在10000次操作之后,这并不是无关紧要的。@Jason-mysql可以防止这种情况发生,尽管它会占用select语句的开销。您如何保护mysql表?mysql不是为您这样做的吗?关于您的框架,您是否建议使用一个具有一列的表,其中包含一行作为要写入的索引声明:面对最多20行,这难道不是无关紧要的吗?@acid:MySQL确保数据完整性,但你要做两个操作:插入和删除。你如何决定删除哪一个?选择表的最小ID并删除?如果两个线程同时这样做怎么办?它们将选择同一行。MySQL无法阻止这一点@Tomalak:10000次操作之后,这并不是无关紧要的。@Jason-mysql可以防止这种情况发生,尽管它需要select语句的开销。