可以固定的时间间隔从数据库表中可靠地进行选择

时间:2013-08-08 14:05:21

标签: mysql

我有一个相当“活跃”的CDR表,我想在过去5分钟内每隔5分钟选择一次记录。问题是它在其他一些列上生成了SHA ID,所以我必须依赖的是一个时间戳字段,通过它我按日期过滤以选择我想要的记录的时间窗口。

接下来的问题是,显然我不能保证我的脚本每次都会在第二次运行,或者服务器的挂钟是正确的(这没关系),最重要的是几乎肯定会有更多每秒一个记录说3行'2013-08-08 14:57:05',在第二个到期之前可能会插入一行。

截至'2013-08-08 14:57:05'并获得记录BETWEEN '2013-08-08 14:57:05' AND '2013-08-08 15:02:05'将有更多关于'2013-08-08 14:57:05'的记录,我会错过。

本质:

  • 不准确的挂钟时间
  • 没有顺序ID
  • 每秒多条记录
  • 查询执行时间
  • 运行查询的频率不可靠

是否都阻止我在指定的滚动时间窗口中获取有效的行集。关于我如何解决这些问题的任何建议?

2 个答案:

答案 0 :(得分:0)

我可能没有得到所有细节,但要回答你的问题标题“以固定的时间间隔从数据库表中可靠地选择” ......

我认为你甚至不希望在“第二次准确”时间运行查询。

该方法的一个关键问题是您必须处理并发访问和锁定。您可能能够在固定的时间发送查询,但您的查询可能在数据库服务器上等待几秒钟(或者正在查看相当过时的快照D b)。特别是在你的情况下,因为桌子显然是“忙”。


作为建议,如果我是你,我会花一些时间考虑一下队列消息系统(比如http://www.rabbitmq.com/只引用一个,而不是预告它是某种方式“你的”解)。无论如何,这些工具可能更适合您的需求。

答案 1 :(得分:0)

如果您使用相同的时钟,那么我认为没有理由为什么会出错。您想要考虑的分辨率是日期时间表。这样,每次根据服务器时间更新开始和停止时间....然后在添加内容时,保证在该时间范围内。

我的意思是,您可以通过硬编码来实现,但我的方式是强行存储数据库中的起点和终点以供使用。

我会用Cron来处理间隔和时间。不要使用时间,而只是不要通过一直检查来锁定数据库。