从频繁更新的mysql表中检索行中的数据块

时间:2018-11-21 10:21:44

标签: mysql database

我的表格的格式如下

  

| ID | TIME | USER |数据|

     

| 1 | 1542785267683 | A |嗨

     

| 2 | 1542785385809 | B |你好|

     

| 3 | 1542785385809 | C |嘿|

     

| 4 | 1542785385809 | D | hii      

| 5 | 1542785385809 | E |呼啦      

| 6 | 1542795485058 | F | hiiiii ||

该表将具有与上面相同的形式,具有1000行。我想从表中检索最新的3行,然后从表中检索接下来的3行,以向用户显示行,就像在消息传递应用程序中向上滑动时查看消息一样。

我尝试了以下方法:

  1. 基于第一个选定块的最后一条消息的时间进行检索。但这是不可能的,因为可能同时存在两行或更多行,这将导致两次显示同一行。
  

选择*从MessageM中,在TIME_RECEIVED      

SELECT *从MessageM,其中TIME_RECEIVED <1542785385809 ORDER BY TIME_RECEIVED DESC LIMIT 3; #留下两行

     

SELECT * FROM MessageM,其中TIME_RECEIVED <= 1542785385809 ORDER BY TIME_RECEIVED DESC LIMIT 3; #复制两行

  1. 我阅读了下面提到的答案

MySQL : retrieve a large select by chunks

我的要求几乎相同,除了可以在检索到块之间的时间内更新表。

所以在使用以下查询时

  

SELECT * FROM Message ORDER BY TIME DESC LIMIT 0,2;

     

SELECT * FROM Message ORDER BY TIME DESC LIMIT 2,4;

如果在连续的选择之间插入新行,则将为下一个选择语句再次获取已经显示的同一行。完全不可能锁定。

可以自动增加列的值来解决该问题,还是可以使用其他方法(例如,添加具有其他约束的新列)来解决该问题或某种形式的分区。

我已计划使用以下查询

  

选择*从消息中,WHERE TIME <= 1542785385809并且ID不在(5,4)按时间顺序限制3排序;

获取最后一行的时间,并从检索到的行中获取具有给定时间的所有行的ID。当第二次查询时,请输入NOT IN条件的ID。

还有其他更好的方法吗?自动递增列可以解决此问题,还是可以使用其他任何方法,例如添加具有其他约束或某种形式的分区的新列。

1 个答案:

答案 0 :(得分:0)

首先,请勿使用时间列进行排序-而是使用ID。我想您的ID列是一个自动递增的整数,因此它是唯一的且插入时间已排序。

其次,让我们考虑一下社交网络(例如LinkedIn)所使用的一种方法:加载供稿(最新的N行)。当您滚动到页面底部时,将加载下一行(另外N行)。当新帖子可用时,您可以按“新帖子”按钮,此按钮将完全重置当前视图并转到开头。这将使您返回第1步,有效地加载最新的N行。

从技术上讲,这是通过以下方式完成的:

SELECT * FROM MessageM ORDER BY ID DESC LIMIT 3;

返回:

  

| 6 | 1542795485058 | F | hiiiii |

     

| 5 | 1542785385809 | E |呼啦|

     

| 4 | 1542785385809 | D | hii |

您还记得ID=4是最后看到的帖子。对于您加载的下一页:

SELECT * FROM MessageM WHERE ID < 4 ORDER BY ID DESC LIMIT 3;

返回:

  

| 3 | 1542785385809 | C |嘿|

     

| 2 | 1542785385809 | B |你好|

     

| 1 | 1542785267683 | A |嗨|

您还记得ID=1是最后看到的帖子。对于您加载的下一页:

SELECT * FROM MessageM WHERE ID < 1 ORDER BY ID DESC LIMIT 3;

不返回任何行。这意味着您无法加载任何较早的帖子。

要重置所有内容,只需转到步骤1:

SELECT * FROM MessageM ORDER BY ID DESC LIMIT 3;

返回:

  

| 7 | 1542785385809 | A |一些新帖子|

     

| 6 | 1542795485058 | F | hiiiii |

     

| 5 | 1542785385809 | E |呼啦|

因此,您阅读了新文章,现在还拥有更多页面。