2017-11-18 229 views
2

一個包含大量數據的表,其中數據插入速率幾乎爲每秒5行。 我正在使用限制和偏移量連同左連接按照created_date(它存儲插入時間戳)降序的無限分頁從該表中獲取數據。如何管理mysql偏移和分頁限制

因此,通過考慮時間,它恰好從表中獲取重複數據。

假設,目前我有1000個數據,爲:

預期輸出:

總記錄:1000

  1. 第一抓取:極限:10,偏移量:0(預期:1000,999,998,... 991)

  2. 第2次提取:限制:10,偏移量:10(Exp ected:990,...,981)

  3. 第三 取:極限:10,偏移量:20(應爲:980,...,971)

實際數據:

  1. 總記錄:1000

    第一抓取:極限:10,偏移量:0(實際:1000,999,998,.... 991)

  2. 總記錄:1005

    第二抓取:極限:10,偏移量:10(實際:995,...,986)

    重複記錄:995,994,993,992,991

  3. 總記錄:1012

    第三抓取:極限: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

您的查詢是沒有意義的,這讓我在一個小的損失,從而進一步幫助。請參閱https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

回答

1

嘗試添加列tab_aid放入where子句。每次請求查詢時,嘗試添加最後一個值tab_aid(假設默認爲最大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_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 
+0

我想你只理解這個問題。感謝您的回覆。但我正在尋找除了添加where子句之外的其他解決方案。 – subhajit