包含大量数据的表,其中数据插入速率几乎是每秒5行。 我使用限制和偏移以及左连接按照created_date的降序(从而存储插入时间戳)来从此表中获取具有无限分页的数据。
因此,通过考虑时间,它恰好从表中获取重复数据。
假设,目前我有1000个数据,用于:
预期输出:
总记录:1000
第一次获取:限制:10,偏移量:0(预期:1000,999,998,.... 991)
第二次获取:限制:10,偏移量:10(预期:990,...,981)
第三 fetch:limit:10,offset:20(预期:980,...,971)
实际数据:
总记录:1000
第一次获取:限制:10,偏移量:0(实际:1000,999,998,...... 991)
总记录:1005
第二次获取:限制:10,偏移量:10(实际值:995,...,986)
重复记录:995,994,993,992,991
总记录:1012
第3次获取:限制:10,偏移量:20(实际值:992,...,983)
重复记录:992,991,990,989,988,987,986
对于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
答案 0 :(得分:1)
尝试将列tab_a
。id
添加到where子句中。每当您请求查询时,请尝试添加上一个tab_a
的值。id
(假设默认值为max tab_a
。id
= 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_a
。id
是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