代码之家  ›  专栏  ›  技术社区  ›  omriman12

使用分页获取大量数据

  •  1
  • omriman12  · 技术社区  · 7 年前

    比如说我有一个 Cloud 环境与A Client 环境和我希望将大量数据从云同步到客户机。假设我在云中有一个DB表,名为 Files 我希望客户端环境中存在完全相同的表。

    现在假设一些事情:

    1. 文件表很大。
    2. 文件中每行的数据可以随时更新,并且 last-update 列。
    3. 我想获取delta并确保在两个环境中都是相同的。

    我的解决方案:

    1. 我首先进行完全同步,将所有条目返回到客户机。
    2. 我保留了 LastSync 在客户机环境中的时间,并从 上次同步 时间。
    3. 我使用分页进行完全同步和增量同步:客户机将启动第一个请求以获取 Count 三角洲的结果以及 Page Size 每个请求。

    例如,计数:

    SELECT COUNT(*) FROM files WHERE last_update > @LastSyncTime
    

    页面提取:

    SELECT col1, col2..
    FROM files 
    WHERE last_update > @LastSyncTime
    ORDER BY files.id
    LIMIT @LIMIT 
    OFFSET @OFFSET
    

    我的问题:

    例如,如果第一次获取 计数 fetch)将花费一些时间(例如几分钟),此时,更多条目已更新并添加到 上次更新 获取。

    例如:

    • CountFetch给出了100个条目 last-update 1000 seconds .
    • 获取时更新了1个条目 计数 .
    • 现在 上次更新1000秒 将给出101个条目。
    • 页面提取将仅从101中获取100个条目,排序依据为 id
    • 1个条目丢失,未同步到客户端

    我尝试过其他两种选择:

    • 正在与同步 from-to 日期限制 上次更新 .
    • 排序依据 上次更新 而不是 身份证件 列。

    我在这两个选项中都看到了问题。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Rick James diyism    7 年前

    -- Initialize.  Note: This subtract is consistent with the later compare. 
    SELECT @left_off := MIN(last_update) - INTERVAL 1 DAY
        FROM tbl;
    
    Loop:
    
        -- Get the ending timestamp:
        SELECT @cutoff := last_update FROM tbl
             WHERE last_update > @left_off
             ORDER BY last_update
             LIMIT 1  OFFSET 100;   -- assuming you decide to do 100 at a time
        -- if no result, sleep for a while, then restart
    
        -- Get all the rows through that timestamp
        -- This might be more than 100 rows
        SELECT * FROM tbl
            WHERE last_update > @left_off
              AND last_update <= @cutoff
            ORDER BY last_update
        -- and transfer them
    
        -- prep for next iteration
        SET @left_off := @cutoff;
    
    Goto Loop
    

    SELECT @cutoff

    SELECT * 是不是很重,而且需要与行数成比例的时间——没有额外的开销 .100行的读取大约需要1秒钟(假设是旋转磁盘,非缓存数据)。

    COUNT(*) ,我会从 MAX(last_update)

        2
  •  0
  •   Georg.Duees    7 年前

    1. 卸载和缓存经常使用的数据,这些数据经常被查询。所以减少了SQL查询的数量。
    2. last_update id

    1. 每当有新项目时,数据库每X次创建一个小时/完整集。

        3
  •  0
  •   Newton Pasqualini Filho    7 年前
    推荐文章