如何管理mysql偏移和限制分页

时间:2017-11-18 05:03:54

标签: mysql pagination limit offset

包含大量数据的表,其中数据插入速率几乎是每秒5行。 我使用限制和偏移以及左连接按照created_date的降序(从而存储插入时间戳)来从此表中获取具有无限分页的数据。

因此,通过考虑时间,它恰好从表中获取重复数据。

假设,目前我有1000个数据,用于:

预期输出:

总记录:1000

  1. 第一次获取:限制:10,偏移量:0(预期:1000,999,998,.... 991)

  2. 第二次获取:限制:10,偏移量:10(预期:990,...,981)

  3. 第三 fetch:limit:10,offset:20(预期:980,...,971)

  4. 实际数据:

    1. 总记录:1000

      第一次获取:限制:10,偏移量:0(实际:1000,999,998,...... 991)

    2. 总记录:1005

      第二次获取:限制:10,偏移量:10(实际值:995,...,986)

      重复记录:995,994,993,992,991

    3. 总记录:1012

      第3次获取:限制:10,偏移量:20(实际值:992,...,983)

      重复记录:992,991,990,989,988,987,986

    4. 对于mysql中的当前请求或过程是否有任何锁定来正确获取数据而不添加另一个where子句,比如记录id大于第一次提取的那样?

      如果解决方案/查询需要进一步的信息,请发表评论。

      我的查询是:

      SELECT `tab_a`.*, `tab_b`.`likes`, `tab_b`.`comment`, `tab_b`.`share` 
      FROM `tab_a` 
      LEFT JOIN `tab_b` ON `tab_a`.`id` = `tab_b`.`post_id` 
      WHERE post_position IN (?) AND (post_date BETWEEN ? AND ?) 
      GROUP BY `tab_a`.`id` ORDER BY `tab_a`.`id` DESC, `tab_b`.`created_date` DESC 
      LIMIT 9 OFFSET 0
      

1 个答案:

答案 0 :(得分:1)

尝试将列tab_aid添加到where子句中。每当您请求查询时,请尝试添加上一个tab_a的值。id(假设默认值为max tab_aid = 1000)。

第一次查询:

select `tab_a`.*, `tab_b`.`likes`, `tab_b`.`comment`, `tab_b`.`share` from `tab_a` 
left join `tab_b` on `tab_a`.`id` = `tab_b`.`post_id` 
where `tab_a`.`id` <= 1000 and post_position in (?) and (post_date between ? and ?) 
group by `tab_a`.`id` order by `tab_a`.`id` desc, `tab_b`.`created_date` desc 
limit 9 offset 0

第二次查询,来自第一个查询结果的最后一个tab_aid是990,那么查询应该是

select `tab_a`.*, `tab_b`.`likes`, `tab_b`.`comment`, `tab_b`.`share` from `tab_a` 
left join `tab_b` on `tab_a`.`id` = `tab_b`.`post_id` 
where `tab_a`.`id` <= 990 and post_position in (?) and (post_date between ? and ?) 
group by `tab_a`.`id` order by `tab_a`.`id` desc, `tab_b`.`created_date` desc 
limit 9 offset 0