从数据库

时间:2015-11-30 23:08:47

标签: mysql django postgresql

我有一张桌子,可以非常频繁地存储我的用户的位置。我想经常查询这个表并返回我还没读过的最新行。

这样做的最佳做法是什么。我的想法是:

  1. 添加boolean读取标志,查询所有结果为false的结果,返回它们然后将它们全部更新。这可能会减少额外的写入速度
  2. 保存客户端上最后一行的id,并查询大于此值的行。这里唯一的问题是我的客户可能会失去他们的位置
  3. 某些数据流
  4. 最终会有多个usersreaders位置,所以这不会有所扩展

1 个答案:

答案 0 :(得分:1)

如果您拥有的是存储行内容的SQL数据库。我建议选项2。

我可能会做的是保留一个时间戳而不是ID,以及一个索引(MSSQL上的聚簇索引或类似的构造,以便新行按时间进行物理排序)。然后只是查询比那更新的东西。

确实会失去他们的位置"问题。如果客户端必须读取已发布的每一行,那么我要么在处理后删除它们,要么在数据库中有一个标志来表明它们已被处理。如果客户端只需要重新开始读取当前数据,那么我会像上面那样做,但是用最新的现有行初始化时间。

如果你必须处理每条记录,不限于数据库,你真正谈论的是一个消息队列。如果您需要能够在处理之后访问单个数据点,那么消息处理的一个步骤可能是插入数据库以供以后查询(除了这对数据执行的任何操作外)读取)。

根据评论编辑:

如果接收时无需处理,但您只想定期更新数据,那么您可以使用保留上次接收时间或ID而不删除数据的解决方案。在这种情况下,我建议不要在重新启动/重新连接时保留最后一个已知的id / timestamp,因为你可能最终无意中加载了一堆数据。只需在重新启动时重置最大值。

另一方面,当我做这样的事情时,我在使用MQTT传输数据方面取得了很大的成功,而对于" live"更新。这是一个发布/订阅消息传递协议。您可以在后端订阅流程并将数据转发到数据库,而想要数据的东西可以直接订阅数据流以进行实时更新。还有一个功能可以保留最后发布的消息并将其转发给新订阅者,这样您就不会完全开空。